Przejdź do głównej zawartości

Linux RH442 - Formatowanie danych przy użyciu AWK

Większość narzędzi służących do monitoringu przedstawia dane w formie tekstowej. Często również nie potrzebujemy wszystkich wartości jakie uzyskujemy za pomocą danego narzędzia, a zachodzi potrzeba wyodrębnić jedynie te konkretne. W jaki sposób więc zwęzić wynik wyświetlany przez dane narzędzie monitorujące ? Dla tego zadania doskonale nadaje się AWK. Jest to interpretowany język programowania, którego głównym zadaniem jest wyszukiwanie i przetwarzanie wzorców tekstowych w plikach i strumieniach danych. AWK zlokalizowane jest w pakiecie "gawk". AWK doskonale nadaje się do pracy z danymi wielokolumnowymi takimi jak uzyskuję się w skutek działania "sar" czy choćby zwykłego listowania plików poleceniem "ll". Jednym z najczęściej używanych poleceń razem z awk jest komenda "print". Polecenie "print" używane jest do wyświetlenia wybranych pól z całego wyniku jaki daje poprzedzająca komenda. Atrybut $1 oznacza pierwsze pole, atrybut $2 drugie, a $3 trzecie pole itd. Ostatnie pole jest reprezentowane przez argument $NF. Reprezentacja przedostatniego pola to $(NF-1), a trzeciego od końca $(NF-2). Cała linia posiada oznaczenie $0. Domyślnymi znakami separującymi w przypadku awk są białe znaki spacji lub tabulatora. Zmiana znaku separatora wykonywana jest przy użyciu przełącznika "-F". Opis języka awk można poznać pod tym adresem. Wokół awk istnieje również społeczność , której strona ma adres awk.info. Warto również poznać ciekawy tutorial http://www.awk.of.pl/

Dla przykładu w pliku /etc/passwd separatorem pól jest znak dwukropka ":". Jeżeli chcemy przy użyciu awk wyświetlić jedynie pierwszą kolumnę zawierającą same loginy składania polecenia będzie wyglądać następująco: 

# awk -F: '{print $1}' /etc/passwd

root
bin
daemon
...
itd...

a w jaki sposób wyświetlić pierwszą i ostatnią kolumnę pliku /etc/passwd ?

# awk -F: '{print $1, $NF}' /etc/passwd

root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin

Dla lepszej czytelności możemy również dodać nagłówek i stopkę dla wyświetlanych wyników, co wykonamy używając "printf". 

# awk -F: 'BEGIN {printf "Loginy oraz powloki systemowe dla uzytkownikow \n"}
{print $1, $NF }
END {printf "KONIEC...\n"}' /etc/passwd

Loginy oraz powloki systemowe dla uzytkownikow
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
...
KONIEC...

Stosując awk możliwe jest również przeszukiwanie tekstów stosując odpowiednie wyrażenia regularne. Najlepiej działanie awk można zobaczyć realizując przykłady. 

Wylistowanie tylko tych linii w pliku /etc/passwd jakie zaczynają się na literę "m".

# awk -F: '/^m/ {print $0}' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

Zliczenie ilości linii w pliku przy użyciu awk podobnie jak wc -l. 

# awk 'END{print NR}' /etc/passwd
35

Zliczenie sumy rozmiaru plików z polecenia ls -l 

# ls -l
total 52
-rw------- 1 root root  1368 Jun 12  2012 anaconda-ks.cfg
-rw-r--r-- 1 root root 29111 Jun 12  2012 install.log
-rw-r--r-- 1 root root  3861 Jun 12  2012 install.log.syslog

# ls -l | awk 'BEGIN{total=0} {total += $5} END{print total}'
34340

Wyświetlenie plików których właścicielem jest podany użytkownik.

# ls -l | awk '$3 == "mariusz"'

Możliwości tego narzędzia oferują szeroką gamę możliwości jeżeli chodzi o tworzenie poleceń, a wraz z użyciem wyrażeń regularnych umożliwiają dowolna obróbkę danych wyjściowych, plików czy strumieni. 

Składnia i więcej informacji oczywiście w manualu. 




Komentarze

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości