Porady Admina: awk
Ostatnia aktualizacja: 14 września 2023, 22:56
W dzisiejszym wpisie z cyklu Porady Admina zajmiemy się programem awk.
awk (lub gawk, czyli: GNU awk) jest programem, który pozwala na wybranie poszczególnych wierszy w pliku i wykonanie na nich operacji.
Gawk jest implementacją GNU języka programowania AWK. Spełnia wytyczne definicji języka zawarte w Standardzie Języków i Narzędzi Wiersza Poleceń POSIX 1003.2 (POSIX 1003.2 Command Language And Utilities Standard). Wersja ta opiera się na opisie zawartym w „The AWK Programming Language” (Aho, Kernighan i Weinberger) z dodatkową funkcjonalnością zdefiniowaną w „System V Release 4 version of UNIX awk”. Gawk obsługuje też najnowsze rozszerzenia Bell Labs awk i niektóre specyficzne dla GNU.
Awk to język skryptowy używany do manipulowania danymi i generowania raportów. Język programowania poleceń awk nie wymaga kompilacji i pozwala użytkownikowi używać zmiennych, funkcji numerycznych, funkcji łańcuchowych i operatorów logicznych.
Awk to narzędzie, które umożliwia programiście pisanie niewielkich, ale skutecznych programów w formie instrukcji definiujących wzorce tekstowe, które mają być wyszukiwane w każdym wierszu dokumentu oraz działania, które należy podjąć, gdy znalezione zostanie dopasowanie w obrębie linia. Awk jest używany głównie do skanowania i przetwarzania wzorców. Przeszukuje jeden lub więcej plików, aby zobaczyć, czy zawierają one linie pasujące do określonych wzorców, a następnie wykonuje powiązane działania.
Program gawk/awk jest dostępny w większości dystrybucji Linux.
Składnia
awk [styl opcji POSIX lub GNU] -f plik_z_programem [--] plik ...
awk [styl opcji POSIX lub GNU] [--] 'program' plik ...
Opcje POSIX | GNU
-f program | –file=program
-F fs | –field-separator=fs
-v zmienna=wartość | –assign=zmienna=wartość
-b | –characters-as-bytes
-c | –traditional
-C | –copyright
-d[plik] | –dump-variables[=plik]
-D[plik] | –debug[=plik]
-e 'tekst-programu’ | –source=’tekst-programu’
-E plik | –exec=plik
-g | –gen-pot
-h | –help
-i plikinclude | –include=plikinclude
-I | –trace
-l biblioteka | -load=biblioteka
-L[fatal|invalid|no-ext] | –lint[=fatal|invalid|no-ext]
-M | –bignum
-N | –use-lc-numeric
-n | –non-decimal-data
-o[plik] | –pretty-print[=plik]
-O | –optimize
-p[plik] | –profile[=plik]
-P | –posix
-r | –re-interval
-s | –no-optimize
-S | –sandbox
-t | –lint-old
-V | –version
Możliwości zastosowania awk:
– Skanuje plik wiersz po wierszu
– Dzieli każdą linię wejściową na pola
– Porównuje wprowadzoną linię/pola ze wzorcem
– Wykonuje akcje na dopasowanych liniach
– Przekształca pliki danych
– Tworzy sformatowane raporty
– Formatuje linie wyjściowe
– Wykonuje operacje arytmetyczne i łańcuchowe
– Tworzy warunki i pętle
Domyślnie Awk drukuje każdą linię danych z podanego pliku, np:
awk '{print}' moj.txt
To jest plik testowy
Druga linia tekstu testowego
Końcowy wiersz mojego pliku
Wydrukuj linie pasujące do podanego wzoru
awk '/linia/ {print}' moj.txt
Druga linia tekstu testowego
Dla każdego rekordu, tj. wiersza, polecenie awk domyślnie dzieli rekord rozdzielany białymi znakami i zapisuje go w zmiennych $n. Jeśli wiersz ma 4 słowa, zostanie zapisany odpowiednio w $1, $2, $3 i $4. Również 0 $ reprezentuje całą linię.
awk '{print $1,$4}' moj.txt
To testowy
Druga testowego
Końcowy pliku
Komenda NR prowadzi bieżące zliczanie liczby rekordów wejściowych. Pamiętaj, że rekordy to zazwyczaj linie. Komenda awk wykonuje instrukcje wzorca/akcji raz dla każdego rekordu w pliku.
awk '{print NR,$0}' moj.txt
1 To jest plik testowy
2 Druga linia tekstu testowego
3 Końcowy wiersz mojego pliku
Wykorzystanie wbudowanych zmiennych NF (Wyświetl ostatnie pole)
awk '{print $1,$NF}' moj.txt
To testowy
Druga testowego
Końcowy pliku
Inne użycie wbudowanych zmiennych NR (Linia wyświetlania od 2 do 3)
awk 'NR==2, NR==3 {print NR,$0}' moj.txt
2 Druga linia tekstu testowego
3 Końcowy wiersz mojego pliku
Aby znaleźć długość najdłuższej linii w pliku
awk '{ if (length($0) > max) max = length($0) } END { print max }' moj.txt
28
Aby policzyć wiersze w pliku
awk 'END { print NR }' moj.txt
3
Drukowanie linii zawierających więcej niż 10 znaków
awk 'length($0) > 10' moj.txt
To jest plik testowy
Druga linia tekstu testowego
Końcowy wiersz mojego pliku
Więcej informacji o programie awk uzyskasz poleceniami:
man awk
awk --help