Korzystając z Linuxa często musimy w jakiś sposób przetworzyć lub wydobyć pewne informacje. W zależności od celu: automatyzacja procesów lub uzyskanie konkretnych informacji z pliku możemy zrobić na kilka sposobów. Jednym z nich jest korzystanie z narzędzia awk. Narzędzie to służy do procesowania tekstu i dzięki niemu może zrobić wiele. Poniżej zapoznasz się z przykładami wykorzystania tej komendy, które pozwolą Tobie przyśpieszyć lub zautomatyzować część pracy.
Odczyt zmiennej/kolumny
AWK przypisuje do każdej kolumny zmienną, która pozwala na jego odczyt. Przykładowe zmienne:
- $0 odczyt wszystkich kolumn
- $1 odczyt pierwszej kolumny
- $2 odczyt drugiej kolumny
- $n odczyt z n-tej kolumny
Domyślnym separatorem pomiędzy wartościami jest spacja lub znak tabulatora.
[root@host ~]# awk '{print $0}' struktura_katalogow total 44284 dr-xr-x---. 21 root root 4096 Jul 12 13:19 . dr-xr-xr-x. 24 root root 4096 Jun 20 14:28 .. -rw-------. 1 root root 2142 Aug 20 2019 anaconda.cfg -rw-------. 1 root root 17147 Jul 14 12:36 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc drwxr-xr-x. 2 root root 9 Aug 20 2019 Desktop drwxr-xr-x. 2 root root 9 Aug 20 2019 Documents drwxr-xr-x. 2 root root 9 Aug 20 2019 Downloads [root@host ~]# awk '{print $1}' struktura_katalog total dr-xr-x---. dr-xr-xr-x. -rw-------. -rw-------. -rw-r--r--. -rw-r--r--. -rw-r--r--. drwx------.
Wykorzystanie separatora
Jeżeli musisz wskazać separator do tekstu, który musisz wyodrębnić skorzystaj z parametru -F
[root@host ~]# awk -F':' '{print $1}' /etc/passwd root bin daemon adm lp sync shutdown halt mail
Powyższa komenda wyświetli zawartość pliku /etc/passwd. Korzystając z separatora : wyświetla pierwszą kolumnę.
Kilka komend
Inną możliwością wykorzystania awk jest wykonanie wielu komend poprzez przekazanie wyniku z wykonania pierwszej komendy z pomocą pipe.
[root@host ~]# echo "Uzywasz systemu Linux?" | awk '{$3="Windows"; print $0}' Uzywasz systemu Windows
Preprocessing
Podczas obróbki tekstu możesz dodać na początku linii tekst, który zostanie wyświetlony. W zależności od potrzeb taka etykieta może nazywać się różnie. Zobacz poniższy przykład.
[root@host ~]# awk 'BEGIN {print "Katalog zawiera:"} {print $0}' struktura_katalogow Katalog zawiera: total 44284 dr-xr-x---. 21 root root 4096 Jul 12 13:19 . dr-xr-xr-x. 24 root root 4096 Jun 20 14:28 .. -rw-------. 1 root root 2142 Aug 20 2018 anaconda.cfg -rw-------. 1 root root 17147 Jul 14 12:36 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc drwxr-xr-x. 2 root root 9 Aug 20 2019 Desktop drwxr-xr-x. 2 root root 9 Aug 20 2019 Documents drwxr-xr-x. 2 root root 9 Aug 20 2019 Downloads
Instrukcja warunkowa
AWK wspiera również instrukcje warunkową if. Mamy plik o takiej zawartości jak poniżej:
[root@host marcin]# cat testfile 10 3 29 18 2341 46 32 40 [root@host marcin]# awk '{if ($1>30) print $i}' testfile 2341 46 32 40
Pętla while
Zakładam, że skoro bierzesz się za korzystanie z awk to masz jakieś pojęcie o pętlach 🙂 Poniżej zamieszczam przykład wykorzystania takiej pętli. W tym przykładzie znajdziesz wyliczenie średniej dla zadanego zestawu liczb.
[root@host marcin]# cat testfile 314 537 150 382 252 125 479 129 195 421 471 247 [root@host marcin]# awk '{ sum = 0 i = 1 while (i < 5) { sum += $i i++ } srednia = sum / 3 print "Wartosc sredniej:",srednia}' testfile Wartosc sredniej: 333.667 Wartosc sredniej: 253 Wartosc sredniej: 267.667 Wartosc sredniej: 379.667
Pętla for
Zastosowanie dla pętli for może wyglądać podobnie jak w przypadku powyższego przykładu.
[root@host marcin]# cat testfile 314 537 150 12 382 252 125 12 479 129 195 12 421 471 244 12 [root@host marcin]# awk '{ > suma = 0 > for (zmienna = 1; zmienna < 5; zmienna++) > { > suma += $zmienna > } > srednia = suma / 3 > print "Wartosc sredniej:",srednia}' testfile Wartosc sredniej: 337.667 Wartosc sredniej: 257 Wartosc sredniej: 271.667 Wartosc sredniej: 382.667
Formatowanie wyniku
W zależności od przypadku awk pozwala na formatowanie wyniku, który drukuje się na ekranie. Określenie formatu wygląda w taki sposób:
%[modyfikator]znak-kontrolny
Dozwolone formaty, które możesz użyć, np. z printf to:
- d – drukuje wartość typu integer
- c – drukuje wartość numeryczną jako string
- f – wartość zmiennoprzecinkowa
- s – drukuje jako tekst (string)
- e – drukuje liczbę w formacie naukowym
[root@host marcin]# awk 'BEGIN{ x = 10*10; printf "Wynik: %d\n", x}' Wynik: 100
Jeśli masz potrzebę wczytania się w dokumentację to tutaj link prowadzący do niej.
Narzędzie awk bardzo często usprawnia codzienną pracy w Linuxie. Istnieje wiele powodów do korzystania z tego narzędzia. Ja osobiście najcześciej wykorzystuje go w szybkim wyodrębnianiu elementów z wyniku poprzedniej komendy. Nie musisz wykonywać żmudnych czynności, żeby wyodrębnić zawartość z kolumny 2., której zawartość jest oddzielona dwukropkiem. To wszystko zrobi za Ciebie awk 🙂