Pomoce: Bash, C, AWK, Sed...

W związku z pojawiającymi się częstymi pytaniami, również na elektroda.pl, o automatyzację zadań, skrypty, Bash, AWK, C, itp. postawiłem w jednym miejscy zbierać udzielane porady.

Zazwyczaj rozwiązywane są błahe problemy, ale skoro pojawiają się takie pytania to będę gromadzić w tym miejscu odpowiedzi.


********
Program w C podaje rozmiar pliku w bajtach.
include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
struct stat statst;
int retc;

if (argc <2)
{
fprintf (stderr, "Podaj nazwe pliku.\n");
return 1;
}

retc=stat (argv[1], &statst);
if (retc)
{
perror ("Blad.");
return 1;
}

printf ("Plik %s ma rozmiar %ld bajtów.\n", argv[1], statst.st_size);

return 0;
}
//end


********
Skrypt podaje rozmiar pliku w bajtach:
#!/bin/bash
ls $1
stat -c%s $1
#lub
du $1 |cut -f 1

********
Informacja o procencie zajętego miejsca na dysku.
df -h /home | awk '{ print $5 }' | tail -n 1
96%

df -h /home | awk '{ print $4 }' | tail -n 1
942M

df -h /home | awk '{ print $5 }'|grep %|cut -d% -f 1
96

df -h /home | cut -d' ' -f11 |tail -n1
96%


********
Rozmiar pliku:
#!/bin/bash
ls $1
stat -c%s $1
#lub:
du $1 |cut -f 1
#lub:
du -h $1 |cut -f 1


********
Dźwięk dzwonka konsoli:
(bell)
#!/bin/bash
echo -e "\a"
#lub:
echo -en '\007'
(ewentualny brak dźwięku spowodowany jest ustawieniami miksera dźwięku lub problemem z podsystemem dźwięku)


********
Odnaleźć w pliku linię zawierającą "txt1", wstawić spację i tekst "true"
1. Wejdź do pliku /etc/soft/soft.conf.
2. Znajdź linię zawierającą "txt1".
3. Za wyrazem wstawić wolne miejsce (spacja) oraz dopisać "true".

#!/bin/bash
plik=/etc/soft/soft.conf
sed -e 's/txt1/txt1 true/' "${plik}"

lub:
awk '{ gsub("txt1", "txt1 true", $0); print $0 }' "${plik}"

lub:
plik=/etc/soft/soft.conf
awkZnajdz="txt1"
awkZmienNa="txt1 true"
daneNowe=`awk -v plik_local="$plik" -v znajdz="$awkZnajdz" -v zamienNa="$awkZmienNa" ' \
BEGIN {
    while (getline<plik_local>0) { \
        for (i=0;i<=NF;i++) { \
             if ($i==znajdz)  { \
                 $i=zamienNa \
             } \
        } \
        print $0
    } \
} \
' "$plik" `
echo "$daneNowe"


********
Jak wyświetlić nazwę procesu najbardziej obciążającego cpu?
ps -aux
ps -uxr
ps -uxrk cpu
ps -auxk -vsz |head -30
w
iostat
lsof


********
ARP:
sysctl -a |grep net.ipv4.neigh
ip ntable show

ip neigh flush all

arp -n |grep ether |grep eth0 |grep -v incomplete |wc -l


********
Instrukcja IF i porównanie z dniem tygodnia,
"jeśli dzisiaj jest środa, to..."
"jeśli dzisiaj jest środa albo piątek,to..."
if [ "$day_of_week" = 3 -o "$day_of_week" = 5 ]

if [ "$day_of_week" = 3 -o "$day_of_week" = 5 -o "$day_of_week" = 7 ]

if [ "$day_of_week" = 3 ] || [ "$day_of_week" = 5 ] || [ "$day_of_week" = 7 ]

if [ "$day_of_week" -gt 3 -a "$day_of_week" -lt 5 ]
(są to nierówności ostre, czyli powyższe wyrażenie prawdziwe będzie tylko dla day_of_week=4)

-o : OR
-a : AND
i jeszcze: man test



********
Wyświetlenie pliku:
cat plik.txt 
more plik.txt 
tail plik.txt


********
Ciągłe wyświetlanie dopisywanych treści do pliku:
tail -f plik.txt

********
Uruchomienie pliku: 
sh plik.txt
bash plik.txt

chmod +x plik.txt ./plik.txt

********
Wyświetlenie informacji o systemie, jak wersja jadra, nazwa systemu: 
uname -a
(Dygresja: kilka razy spotkała mnie taka sytuacja: stosunkowo doświadczeni administratorzy, prawie konspiracyjnym szeptem, poinformowali mnie o istnieniu takiego polecenia... jednego z najbardziej podstawowych poleceń. Od razu widać czy kiedykolwiek kompilowali jądro)

********
Skrypt, a właściwie dwa, służące do testowania zużycia energii przez twarde dyski:
SSD vs HDD ile energii zużywa dysk
Drugi plik po założonym czasie "zabija" plik pierwszy, który przeprowadza testy. Jednocześnie wyświetlany jest czas do końca testów (przybliżony, ponieważ funkcja sleep nie działa bardzo precyzyjnie).


Skrypt: powerdisk
#!/usr/local/bin/bash
diskusb=/diskpowertest
timerun=`date +%s`
timestop=$[timerun+1800]

./stopprocess $$ $timestop &
case "$1" in
 standby)       echo "Standby test!"
                    while [ 1 ] ; do
                    filename=`date +%s`
                    touch "$diskusb/$filename"
                    sync
                    cp "$diskusb/$filename" /dev/null
                    sleep 5
                done ;;
 write)         echo "Write test!"
                while [ 1 ] ; do
                    for (( i=1; $i<=33; i++ )) ; do
                        mkdir "$diskusb/usr$i"
                        cp -r /usr/local/* "$diskusb/usr$i/"
                        sync
                    done
                    while [ 1 ] ; do
                        rm -r "$diskusb/usr33"
                        mkdir "$diskusb/usr33"
                        cp -r /usr/local/*  "$diskusb/usr33/"
                        sync
                    done
                done ;;
 read)          echo "Read test!"
                while [ 1 ] ; do
                    for ((i=1; $i<=16; i++)) ; do
                        tar -cf /dev/null  "$diskusb/usr$i"
                    done
                done ;;
 *)             echo "Bledny wybor" ;;
esac


Skrypt: stopprocess
#!/usr/local/bin/bash
# $1 PID
# $2 timestop
processtop=$1
      timestop=$2

while [ 1 ] ; do
 timenow=`date +%s`
 if  [ "$timestop" -lt "$timenow" ] ; then
  kill -9 $processtop
  exit 1
 fi
 echo $[timenow-timestop]
 sleep 2

done

********
Kodowanie ffmpeg:


Skrypt uruchamiany w danym katalogu przetwarza wszystkie pliki *.VOB na pojedynczy plik .mp4  Ustawienie ffmpeg dostosowane do transkodowania plików DV nagranych z kamery poprzez firewire.

#!/bin/bash
for f in ./*.dv; do
    ffmpeg -i $"f" -preset slow  -b:v 500k  -b:a 128k -strict -2 -deinterlace  $"{f%.dv*}.mp4"
done 

Skrypt przegląda podkatalogi szukając nazwy "VIDEO_TS". Następnie koduje wszystkie pliki *.VOB z danego katalogu do jednego pliku .mp4  Plik wynikowy ma nazwę katalogu.
Jeżeli w pliku docelowym istnieje plik *.mp4 to nie podejmowane jest rekodowanie.
ffmpeg używa ustawień dostosowanych do transkodowania plików zgranych z DVD.
#!/usr/local/bin/bash

for i in `find . -type d -depth 1`; do
    #midipatch="$maindirectory${i:1}"/VIDEO_TS/
    midipatch=`pwd`"${i:1}"/VIDEO_TS/
    #echo "$midipatch"
    if [ -d "$midipatch" ]
    then
        if [ ! -f "$midipatch"*mp4 ]
        then
            echo "************************************"
            echo "************************************"
            echo "${i:2}"
            echo "************************************"
            echo "************************************"
            #cat "$midipatch"*.VOB | ffmpeg -i - -preset veryslow  -b:v 500k  -threads 1 -b:a 128k -strict -2 "$midipatch""${i:2}".mp4
            cat "$midipatch"*.VOB | ffmpeg -i - -preset veryslow  -b:v 500k  -b:a 128k -strict -2 "$midipatch""${i:2}".mp4
        fi
    fi
done

********
Zmiana rozmiaru zdjęć (resize)

Skrypt uruchamiany w danym katalogu przetwarza wszystkie pliki *.jp* i *.JP*  Program mogrify jest jednowątkowy, więc skrypt uruchamia maksymalnie jego trzy kopie.
#!/usr/local/bin/bash

directory=`pwd`

IFS=$'\n'; for i in `find . -type f -iname "*.jp*" | sort`; do
    while [ 4 -le `ps aux |grep mogrify |wc -l` ]
    do
        sleep 0.5
    done
    midipatch="$directory${i:1}"
    #echo "$midipatch"
    mogrify -verbose -resize 1280 -quality 92 "$midipatch" &
done


********
Zmiana zdjęć RAW (ARW i ORF) na JPEG

Skrypt uruchamiany w danym katalogu przetwarza wszystkie pliki *.arw, *.ARW, *.orf i *.ORF Program ufraw-batch jest jednowątkowy, więc skrypt uruchamia maksymalnie jego trzy kopie.
#!/usr/local/bin/bash

directory=`pwd`

IFS=$'\n';for i in `find . -type f -iname "*.ARW" -or -iname "*.ORF"`; do
    while [ 4 -le `ps aux |grep ufraw |wc -l` ]
    do
        sleep 0.5
    done
    midipatch="$directory${i:1}"
    endpath=`dirname "$midipatch"`
    endpatch=`dirname "$midipatch"`
    #echo "$midipatch"
    #echo "$endpatch"
    ufraw-batch --out-type=jpeg --wb=camera  --compression=94 --overwrite --out-path="$endpatch" "$midipatch" &
done



********
Bez polskich znaków
unpolish(){
       sed '
               s/ą/a/g ; s/Ą/A/g
               s/ć/c/g ; s/Ć/C/g
               s/ę/e/g ; s/Ę/E/g
               s/ł/l/g ; s/Ł/L/g
               s/ń/n/g ; s/Ń/N/g
               s/ó/o/g ; s/Ó/O/g
               s/ś/s/g ; s/Ś/S/g
               s/ź/z/g ; s/Ź/Z/g
               s/ż/z/g ; s/Ż/Z/g
               s/ /_/g
                s/-/_/g
       ' | tr -s [:upper:] [:lower:]
}



********

Więcej informacji:
Informatyka, FreeBSD, Debian


***

Inne wpisy:



Update: 2015.02.09
Create: 2015.02.09

Brak komentarzy:

Prześlij komentarz