fbpx

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 🙂