Polecenie AWK to potężne i wszechstronne narzędzie do przetwarzania i transformacji danych tekstowych w systemie Linux. Niezależnie od tego, czy chcesz wyodrębnić informacje, filtrować wiersze, formatować dane wyjściowe, czy wykonywać obliczenia, AWK może uprościć Twoją pracę za pomocą zaledwie kilku linijek kodu. W tym artykule dowiesz się, jak używać polecenia AWK do manipulacji tekstem w systemie Linux.
Czym jest polecenie AWK?

Polecenie AWK to interpretowany język programowania, który działa w terminalu systemu Linux. Jego nazwa pochodzi od inicjałów jego twórców: Alfreda Aho, Petera Weinbergera i Briana Kernighana. AWK został pierwotnie zaprojektowany do obsługi plików o strukturze pól rozdzielonych ogranicznikami, takich jak pliki CSV czy /etc/passwd. AWK może jednak również przetwarzać bardziej złożone pliki tekstowe, takie jak pliki HTML czy XML. AWK nie jest obiektowym językiem programowania , ale pozwala na definiowanie lokalnych i globalnych funkcji oraz zmiennych. Posiada również struktury sterujące, takie jak pętle i instrukcje warunkowe.
Ogólna składnia polecenia AWK jest następująca:
awk [opcje] 'program' [pliki]
Program to sekwencja instrukcji, które definiują wzorce do wyszukania w każdym wierszu pliku ( plików oraz działania do wykonania po znalezieniu wzorca. Opcje pozwalają modyfikować działanie polecenia AWK, na przykład wybór separatora pola lub formatu wyjściowego.
Jak wydrukować tekst za pomocą polecenia AWK?

Polecenie AWK może służyć do drukowania komunikatu w terminalu na podstawie wzorca w tekście. Jeśli uruchomisz polecenie AWK bez wzorca, a jedynie polecenie drukowania, AWK będzie drukował komunikat za każdym razem, gdy naciśniesz Enter.
Na przykład, jeśli wpiszesz:
awk '{print "Witaj"}'
A jeśli naciśniesz Enter kilka razy, otrzymasz:
Cześć Cześć Cześć
Aby zatrzymać polecenie AWK, możesz nacisnąć Ctrl+C.
Jeśli chcesz wydrukować zawartość pliku za pomocą polecenia AWK, możesz użyć specjalnego wzorca `BEGIN` , który jest wykonywany przed odczytaniem pliku, oraz specjalnego wzorca `END` , który jest wykonywany po odczytaniu pliku. Na przykład, jeśli masz plik o nazwie `test.txt` zawierający:
To jest test. AWK to świetne narzędzie. Linux to najlepszy system operacyjny
Zawartość pliku można wydrukować za pomocą następującego polecenia:
awk 'BEGIN {print "Oto zawartość pliku test.txt:"} {print} END {print "Koniec pliku"}' test.txt
Co daje:
Oto zawartość pliku test.txt: To jest test. AWK to świetne narzędzie. Linux to najlepszy system operacyjny. Koniec pliku
Polecenie {print} bez argumentów drukuje cały wiersz. Można również wydrukować konkretne pole za pomocą zmiennej $n , gdzie n to numer pola. Domyślnie pola są rozdzielone spacjami lub tabulatorami, ale można zmienić separator za pomocą -F .
Na przykład, jeśli chcesz wydrukować pierwsze i trzecie pole pliku /etc/passwd , które są rozdzielone dwukropkami ( :) , możesz użyć następującego polecenia:
awk -F: '{drukuj $1 " " $3}' /etc/passwd
Co daje coś takiego:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...
Możesz również drukować wyrażenia arytmetyczne lub ciągi znaków za pomocą polecenia AWK. Na przykład, aby wydrukować kwadrat drugiego pola w pliku test.txt , możesz użyć następującego polecenia:
awk '{print $2^2}' test.txt
Co daje:
ma 16 lat
Aby wyświetlić liczbę wierszy w pliku test.txt , możesz użyć specjalnej zmiennej NR , która zawiera numer bieżącego wiersza. Na przykład, możesz użyć następującego polecenia:
awk 'END {print NR}' test.txt
Co daje:
3
Jak filtrować tekst za pomocą polecenia AWK?

Polecenie AWK może służyć do filtrowania tekstu na podstawie wzorców lub warunków. Jeśli określisz wzorzec przed akcją, AWK wykona ją tylko wtedy, gdy wzorzec zostanie znaleziony w wierszu. Wzorzec może być wyrażeniem regularnym, porównaniem, operacją logiczną lub kombinacją tych elementów.
Na przykład, jeśli chcesz wydrukować wiersze z test.txt zawierające słowo Linux , możesz użyć następującego polecenia:
awk '/Linux/ {print}' test.txt
Co daje:
Linux jest najlepszym systemem operacyjnym
Jeśli chcesz wydrukować wiersze w /etc/passwd , których UID jest większy niż 1000, możesz użyć następującego polecenia:
awk -F: '$3 > 1000 {print}' /etc/passwd
Co daje coś takiego:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:stos oprogramowania TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
można również używać operatorów logicznych && (i), || (lub) i ! (nie). Na przykład, aby wyświetlić wiersze w /etc/passwd z UID większym niż 1000 i powłoką inną niż /usr/sbin/nologin , można użyć następującego polecenia:
awk -F: '3 $ > 1000 && 7 $ != "/usr/sbin/nologin" {print}' /etc/passwd
Kopia
Co daje coś takiego:
tss:x:131:142:Stos oprogramowania TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Jak edytować tekst za pomocą polecenia AWK?

Polecenie AWK może służyć do modyfikacji tekstu za pomocą funkcji wbudowanych lub zmiennych specjalnych. Na przykład, aby zastąpić spacje myślnikami w pliku test.txt , można użyć gsub , która zastępuje wszystkie wystąpienia jednego ciągu znaków innym. Można również użyć OFS , która definiuje separator pól wyjściowych. Na przykład, można użyć następującego polecenia:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Co daje:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Aby dowiedzieć się więcej o innych dostępnych funkcjach i zmiennych, zapoznaj się z podręcznikiem poleceń AWK.
Jak używać pętli for z poleceniem AWK?
Polecenie AWK może być używane do wykonywania pętli for na polach lub wierszach pliku. Składnia pętli for jest następująca:
dla (zmiennej w tablicy) akcja
Gdzie zmienna jest nazwą zmiennej, która kolejno pobiera wartości z tablicy , a akcja jest akcją, która ma być wykonywana przy każdej iteracji.
Na przykład, jeśli chcesz wydrukować pola pliku w odwrotnej kolejności, możesz użyć pętli for ze specjalną zmienną NF , która zawiera liczbę pól w bieżącym wierszu. Na przykład, jeśli masz plik o nazwie test.txt , który zawiera:
To jest test. AWK to świetne narzędzie. Linux to najlepszy system operacyjny
Możesz odwrócić kolejność pól za pomocą następującego polecenia:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Co daje:
Jednym z testów jest to potężne narzędzie; innym - AWK; najlepszym systemem operacyjnym jest Linux

Możesz również użyć pętli for do iteracji po wierszach pliku ze specjalną zmienną FNR , która zawiera numer wiersza bieżącego pliku. Na przykład, aby wydrukować parzyste wiersze pliku test.txt , możesz użyć następującego polecenia:
awk 'FNR%2==0 {print FNR}' test.txt
Co daje:
2
4
Jak uruchomić skrypt AWK?
Aby uruchomić skrypt AWK, możesz umieścić go w pliku z .awk i nadać mu uprawnienia do wykonywania poleceniem chmod +x . Następnie możesz uruchomić skrypt poleceniem ./script_name.awk [files] .
Na przykład, jeśli masz skrypt o nazwie hello.awk , który zawiera:
#!/usr/bin/awk -f BEGIN {print "Witaj"}
Możesz uruchomić skrypt za pomocą następującego polecenia:
./cześć.awk
Co daje:
Dzień dobry
Jak przekazać argumenty do skryptu AWK?

Aby przekazać argumenty do skryptu AWK, możesz użyć dwóch metod:
- Pierwsza metoda polega na użyciu
-vz formatemzmienna=wartość. Na przykład, jeśli chcesz przekazać dwa argumenty o nazwachvar1ivar2dohello.awk, możesz użyć następującego polecenia:
awk -v var1=cześć -v var2=świat -f cześć.awk
W hello.awk możesz uzyskać dostęp do argumentów za pomocą zmiennych $var1 i $var2 . Na przykład, jeśli Twój skrypt zawiera:
#!/usr/bin/awk -f POCZĄTEK {drukuj $zmienna1 " " $zmienna2}
Otrzymujesz:
Witaj świecie
- Druga metoda polega na użyciu specjalnej
ARGV, która zawiera argumenty przekazane do skryptu. Na przykład, jeśli chcesz przekazać dwa nienazwane argumenty dohello.awk, możesz użyć następującego polecenia:
awk -f hello.awk witaj świecie
W hello.awk możesz uzyskać dostęp do argumentów, używając indeksów ARGV[1] i ARGV[2] . Na przykład, jeśli Twój skrypt zawiera:
#!/usr/bin/awk -f ROZPOCZNIJ {drukuj ARGV[1] " " ARGV[2]}
Otrzymujesz:
Witaj świecie
Często zadawane pytania
Jaka jest różnica między AWK i GAWK?
GAWK to implementacja GNU języka AWK, która wzbogaca oryginalny język o dodatkowe funkcje, takie jak obsługa rozszerzonych wyrażeń regularnych, tablic wielowymiarowych i predefiniowanych funkcji.
Jak debugować skrypt AWK?
opcji -W z lint , która wyświetla komunikaty ostrzegawcze o potencjalnych błędach w skrypcie. Można również użyć -W z dump-variables , która wyświetla wartości zmiennych po zakończeniu wykonywania skryptu.
Jak sortować dane za pomocą polecenia AWK?
Aby użyć polecenia AWK do sortowania danych, możesz użyć `sort` w połączeniu z AWK. Na przykład, aby posortować użytkowników w `/etc/passwd` według ich UID, możesz użyć następującego polecenia:
awk -F: '{drukuj $1, $3}' /etc/passwd | sort -n -k2
Łącząc AWK z innymi poleceniami (w tym przypadku sort ), można łatwo pójść o wiele dalej w wyświetlaniu i organizowaniu danych.
Jak wydrukować liczbę słów w pliku za pomocą polecenia AWK?
Aby wydrukować liczbę słów w pliku za pomocą polecenia AWK, można użyć zmiennej specjalnej NF , która zawiera liczbę pól w bieżącym wierszu, oraz zmiennej specjalnej NR , która zawiera numer bieżącego wiersza. Za pomocą pętli for można policzyć liczbę słów w każdym wierszu i dodać ją do zmiennej o nazwie total . Używając wzorca specjalnego END , można wydrukować wynik końcowy. Na przykład, jeśli plik o nazwie test.txt zawiera:
To jest test. AWK to świetne narzędzie. Linux to najlepszy system operacyjny
Liczbę słów w pliku można wyświetlić za pomocą następującego polecenia:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Co daje:
9
Jak użyć polecenia AWK do wyodrębnienia danych z pliku CSV?
Aby użyć polecenia AWK do wyodrębnienia danych z pliku CSV (wartości rozdzielone przecinkami), możesz użyć -F , aby ustawić przecinek jako separator pól. Na przykład, jeśli masz plik o nazwie test.csv , który zawiera:
Imię, nazwisko, wiek: Alice Dupont, 25 lat; Bob Martin, 32 lata; Charles Durand, 28 lat
Możesz wyodrębnić imię i wiek osób, korzystając z następującego polecenia:
awk -F"," '{print $1 " " $3}' test.csv
Co daje:
Imię, wiek: Alicja 25, Bob 32, Karol 28
Jak filtrować dane za pomocą polecenia AWK?
Polecenie AWK umożliwia filtrowanie danych na podstawie wzorców, które są wyrażeniami regularnymi lub warunkami logicznymi. Wzorce są umieszczane przed akcjami i rozdzielane nawiasami klamrowymi. Na przykład, aby wyświetlić wiersze w pliku test.csv zawierające imię Alicja , można użyć następującego wzorca:
awk -F"," '/Alice/ {print}' test.csv
Co daje:
Alicja, Dupont, 25 lat
Jeśli chcesz wyświetlić wiersze w test.csv , które są starsze niż 30 lat, możesz użyć następującego wzorca:
awk -F"," '$3 > 30 {print}' test.csv
Co daje:
Bob, Martin, 32
Możesz łączyć wiele wzorców za pomocą operatorów logicznych && (i), || (lub) i ! (nie). Na przykład, aby wyświetlić wiersze w pliku test.csv , których nazwa zaczyna się od C lub których wiek jest krótszy niż 10 lat, możesz użyć następującego wzorca:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {drukuj}' test.csv
Co daje:
CAMILLE, M, 7 CLARA, K, 11 CLEMENT, M, 7
Jak obliczyć statystyki za pomocą polecenia AWK?
Polecenie AWK umożliwia obliczenie statystyk danych liczbowych w pliku, takich jak suma, średnia, minimum lub maksimum. Aby to zrobić, wystarczy użyć zmiennych do przechowywania wartości pośrednich i aktualizować je w każdym wierszu. Używając specjalnego END , można wyświetlić wynik końcowy. Na przykład, aby obliczyć sumę i średnią wieku w pliku test.csv , można użyć następującego programu:
awk -F"," 'NR>1 {suma+=$3; liczba++} KONIEC {drukuj "Suma: " suma; drukuj 'Średnia: 'suma/liczba}' test.csv
Co daje:
Razem: 110 Średnia: 18,3333
Wyjaśnienie:
-
-F","służy do zdefiniowania przecinka jako separatora pól. -
NR>1stosujemy , aby zignorować pierwszy wiersz pliku, który zawiera nazwy kolumn. - Używamy zmiennych
sumicountdo akumulacji sumy i liczby wieków. Używamy operatora+=do inkrementacji zmiennych o wartość trzeciego pola ($3). -
ENDsłuży/służy do obliczenia średniej poprzez podzielenie sumy przez liczbę.
Podobnie, jeśli chcesz obliczyć minimalny i maksymalny wiek w test.csv , możesz użyć następującego programu:
awk -F"," 'NR>1 {jeśli (min=="") min=max=$3; jeśli ($3<min) min=$3; if ($3> max) max=$3} KONIEC {drukuj "Min: " min; drukuj 'Maks.: 'maks.}' test.csv
Co daje:
Min: 6 Maks: 32
Wyjaśnienie:
-
-F","służy do zdefiniowania przecinka jako separatora pól. -
NR>1stosujemy , aby zignorować pierwszy wiersz pliku, który zawiera nazwy kolumn. - Zmienne
minimaxJeśli są puste (""inicjujemy te zmienne wartością trzeciego pola ($3. Używamy operatorów<i>do porównywania wartości i aktualizacji zmiennych, jeśli to konieczne. - Wzorzec
ENDdo wyświetlania wyniku końcowego.
Wniosek
Polecenie AWK to niezbędne narzędzie do manipulowania tekstem w systemie Linux. Pozwala ono wykonywać złożone zadania w zaledwie kilku linijkach kodu, takie jak wyodrębnianie, filtrowanie, modyfikowanie czy obliczanie danych. Oferuje dużą elastyczność dzięki wzorcom, akcjom, funkcjom i zmiennym. Można je łączyć z innymi poleceniami systemu Linux, aby rozszerzyć jego możliwości. Na przykład, polecenie Echo w Windows umożliwia wyświetlenie komunikatu lub zmiennej na ekranie. Aby dowiedzieć się więcej o poleceniu AWK, zapoznaj się z instrukcją obsługi lub licznymi samouczkami dostępnymi online.


