Skip to main content

Jak pisać komendy i skrypty AWK

[PL] Tutorial porządnego pisania skryptów bash - #1 Wstęp, dobre praktyki i przydatne narzędzie (Czerwiec 2026)

[PL] Tutorial porządnego pisania skryptów bash - #1 Wstęp, dobre praktyki i przydatne narzędzie (Czerwiec 2026)
Anonim

Komenda awk jest wydajną metodą przetwarzania lub analizy plików tekstowych - w szczególności plików danych uporządkowanych według linii (wierszy) i kolumn.

Prosty awk polecenia można uruchamiać z wiersza poleceń. Bardziej skomplikowane zadania należy zapisywać do pliku jako programy awk (tak zwane skrypty awk).

Podstawowy format polecenia awk wygląda następująco:

awk 'wzorzec {akcja}' plik-wejściowy> plik-wyjściowy

Oznacza to: pobranie każdej linii pliku wejściowego; jeśli linia zawiera wzorzec, zastosuj akcję do linii i zapisz wynikową linię do pliku wyjściowego. Jeśli wzór zostanie pominięty, akcja zostanie zastosowana do wszystkich linii. Na przykład:

awk '{print $ 5}' table1.txt> output1.txt

Ta instrukcja przyjmuje element 5. kolumny każdej linii i zapisuje ją jako wiersz w pliku wyjściowym "output.txt". Zmienna "4 $" odnosi się do drugiej kolumny. Podobnie możesz uzyskać dostęp do pierwszej, drugiej i trzeciej kolumny, za pomocą $ 1, 2 $, 3 $ itp. Domyślnie kolumny są oddzielone spacjami lub tabulatorami (tzw. Białe znaki). Tak więc, jeśli plik wejściowy "table1.txt" zawiera następujące linie:

1, Justin Timberlake, tytuł 545, cena 7,30 USD2, Taylor Swift, tytuł 723, cena 7,90 USD3, Mick Jagger, tytuł 610, cena 7,90 USD4, Lady Gaga, tytuł 118, cena 7,30 USD5, Johnny Cash, tytuł 482, cena 6,50 USD6, Elvis Presley, tytuł 335, cena 7,30 USD7, John Lennon, tytuł 271, cena 7,90 USD8, Michael Jackson, tytuł 373, cena 5,50 USD

Następnie polecenie wypisze następujące linie do pliku wyjściowego "output1.txt":

545,723,610,118,482,335,271,373,

Jeśli separatorem kolumn jest coś innego niż spacje lub tabulatory, na przykład przecinek, możesz to określić w instrukcji awk w następujący sposób:

awk-F, '{print $ 3}' table1.txt> output1.txt

To wybierze element z kolumny 3 każdej linii, jeśli kolumny są rozdzielone przecinkiem. W związku z tym wyjście, w tym przypadku, byłoby:

Tytuł 545 Tytuł 723 Tytuł 610 Tytuł 118 Tytuł 482 Tytuł 335 Tytuł 271 Tytuł 373

Lista instrukcji wewnątrz nawiasów klamrowych ("{", "}") nazywa się blokiem. Jeśli wstawisz wyrażenie warunkowe przed blokiem, instrukcja wewnątrz bloku zostanie wykonana tylko wtedy, gdy warunek będzie prawdziwy.

awk "7 $ ==" 7,30 $ "{wydrukuj 3 $}" table1.txt

W tym przypadku warunek wynosi 7 USD == " 7,30 USD", co oznacza, że ​​element w kolumnie 7 wynosi 7,30 USD. Odwrotny ukośnik przed znakiem dolara służy zapobieganiu interpretacji 7 USD jako zmiennej, a zamiast tego dosłownie ujmuje znak dolara.

Tak więc ta instrukcja awk wypisuje element w trzeciej kolumnie każdej linii, która ma "7,30 $" w kolumnie 7.

Jako warunku można również użyć wyrażeń regularnych. Na przykład:

awk '/ 30 / {print $ 3}' table1.txt

Ciąg pomiędzy dwoma ukośnikami ("/") jest wyrażeniem regularnym. W tym przypadku jest to tylko ciąg "30." Oznacza to, że jeśli linia zawiera ciąg "30", system wypisze element w trzeciej kolumnie tego wiersza. Dane wyjściowe w powyższym przykładzie będą następujące:

Timberlake, Zramolały, Presley,

Jeśli elementy tabeli są liczbami, awk może wykonywać obliczenia na nich, jak w tym przykładzie:

awk "{wydrukuj (2 USD * 3 USD) + 7 USD}"

Poza zmiennymi, które uzyskują dostęp do elementów bieżącego wiersza (1 $, 2 $ itd.), Istnieje zmienna $ 0, która odnosi się do kompletnego wiersza (wiersza) i zmiennej NF, która przechowuje do liczby pól.

Możesz również zdefiniować nowe zmienne jak w tym przykładzie:

awk '{sum = 0; dla (col = 1; col <= NF; col ++) sum + = $ col; drukuj sumę; } "

To oblicza i wypisuje sumę wszystkich elementów każdego rzędu.

Wyrażenia awk często łączone są z poleceniami sed.