Polecenie AWK to potężne i wszechstronne narzędzie do przetwarzania i przekształcania danych tekstowych w systemie Linux. Niezależnie od tego, czy wyodrębniasz informacje, filtrujesz wiersze, formatujesz dane wyjściowe, czy wykonujesz obliczenia, AWK może ułatwić Ci życie za pomocą zaledwie kilku linijek kodu. W tym artykule dowiesz się, jak używać polecenia AWK do manipulacji tekstem w systemie Linux.
Co to jest polecenie AWK?
Polecenie AWK jest interpretowanym językiem programowania uruchamianym na terminalu Linux. Jego nazwa pochodzi od inicjałów jego twórców: Alfreda Aho, Petera Weinbergera i Briana Kernighana. AWK został pierwotnie zaprojektowany do przetwarzania plików podzielonych na pola oddzielone ogranicznikami, takich jak pliki CSV lub pliki /etc/passwd. Ale AWK może również obsługiwać bardziej złożone pliki tekstowe, takie jak pliki HTML lub XML. AWK nie jest obiektowym językiem programowania , ale umożliwia definiowanie lokalnych lub globalnych funkcji i zmiennych. Posiada również struktury sterujące, takie jak pętle i warunki.
Ogólna składnia polecenia AWK jest następująca:
awk [opcje] „program” [pliki]
Program to seria instrukcji definiujących wzorce do wyszukiwania w każdej linii pliku (
plików
oraz działania, które należy wykonać po znalezieniu wzorca. Opcje pozwalają na modyfikację zachowania polecenia AWK, np. wybór ogranicznika pola czy formatu wyjściowego .
Jak wydrukować tekst za pomocą polecenia AWK?
Polecenie AWK może zostać użyte do wydrukowania komunikatu do terminala w oparciu o wzór w tekście. Jeżeli bez powodu uruchomisz polecenie AWK, a jedynie polecenie drukowania, AWK wyświetli komunikat za każdym razem, gdy naciśniesz Enter.
Na przykład, jeśli wpiszesz:
awk '{drukuj "Witam"}'
I naciskasz Enter kilka razy, otrzymujesz:
Dzień dobry, dzień dobry, dzień dobry
Aby zatrzymać polecenie AWK, możesz nacisnąć Ctrl+C.
Jeżeli chcesz wydrukować zawartość pliku za pomocą polecenia AWK, możesz skorzystać ze BEGIN
, który uruchamia się przed odczytaniem pliku, oraz END
, który uruchamia się po odczytaniu pliku. 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 wydrukować zawartość pliku za pomocą następującego polecenia:
awk 'BEGIN {print "Oto zawartość pliku test.txt:"} {print} END {print "Koniec pliku"}' test.txt
Które dają:
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 wypisuje całą linię. Możesz także wydrukować określone pole, używając $n
, gdzie n
jest numerem pola. Domyślnie pola oddzielane są spacjami lub tabulatorami, ale możesz zmienić separator za pomocą -F
.
Na przykład, jeśli chcesz wydrukować pierwsze i trzecie pole pliku /etc/passwd
, oddzielone dwukropkiem ( :)
, możesz użyć następującego polecenia:
awk -F: '{print $1 " " 3 $}' /etc/passwd
Co daje coś takiego:
root 0 demon 1 bin 2 sys 3 synchronizacja 4 gry 5 człowiek 6 lp 7 poczta 8 aktualności 9 uucp 10 proxy 13 www-data 33 ...
Za pomocą polecenia AWK można także drukować wyrażenia arytmetyczne lub ciągi znaków. Na przykład, jeśli chcesz wydrukować kwadrat drugiego pola pliku test.txt
, możesz użyć następującego polecenia:
awk '{print $2^2}' test.txt
Które dają:
jest 16 jest
Jeśli chcesz wydrukować liczbę linii w test.txt
, możesz użyć specjalnej zmiennej NR
, która zawiera numer bieżącej linii. Na przykład możesz użyć następującego polecenia:
awk 'END {print NR}' test.txt
Które dają:
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 przed akcją określisz wzorzec, AWK wykona akcję tylko wtedy, gdy wzorzec zostanie znaleziony w wierszu. Wzorzec może być wyrażeniem regularnym, porównaniem, operacją logiczną lub ich kombinacją.
Na przykład, jeśli chcesz wydrukować linie z test.txt
zawierające słowo Linux
, możesz użyć następującego polecenia:
awk '/Linux/ {drukuj}' test.txt
Które dają:
Linux jest najlepszym systemem operacyjnym
Jeśli chcesz wydrukować linie z /etc/passwd
, których UID jest większy niż 1000, możesz użyć następującego polecenia:
awk -F: '3 $ > 1000 {drukuj}' /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żesz także użyć operatorów logicznych &&
(i), ||
(lub) i !
(nie) do łączenia wzorów. Na przykład, jeśli chcesz wydrukować linie z /etc/passwd
, które mają UID większy niż 1000 i powłokę inną niż /usr/sbin/nologin
, możesz użyć następującego polecenia:
awk -F: '3 $ > 1000 && 7 $ != "/usr/sbin/nologin" {print}' /etc/passwd
Kopiować
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 umożliwia modyfikację tekstu za pomocą funkcji wbudowanych lub zmiennych specjalnych. Na przykład, jeśli chcesz zastąpić spacje łącznikami w test.txt
, możesz użyć gsub
, która zastępuje wszystkie wystąpienia jednego ciągu innym. Można także użyć specjalnej OFS
, która definiuje separator pola wyjściowego. Na przykład możesz użyć następującego polecenia:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Które dają:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Możesz zapoznać się z instrukcją poleceń AWK, aby poznać inne dostępne funkcje i zmienne.
Jak używać pętli for z poleceniem AWK?
Komendy AWK można używać do wykonywania pętli for na polach lub liniach w pliku. Składnia pętli for jest następująca:
for (zmienna w tablicy) akcja
Gdzie zmienna
to nazwa zmiennej, która sukcesywnie pobiera wartości z tablicy
, a akcja
to akcja, którą należy wykonać w 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żącej linii. Na przykład, jeśli masz 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
Które dają:
test jeden to To świetne narzędzie. Jednym z nich jest system operacyjny AWK, najlepszy jest Linux
Możesz także użyć pętli for do iteracji po wierszach pliku ze specjalną FNR
, która zawiera numer wiersza odnoszący się do bieżącego pliku. Na przykład, jeśli chcesz wydrukować parzyste numery linii pliku test.txt
, możesz użyć następującego polecenia:
awk 'FNR%2==0 {wydrukuj FNR}' test.txt
Które dają:
2
4
Jak uruchomić skrypt AWK?
rozszerzeniem .awk
i nadać mu uprawnienia do wykonywania za pomocą chmod +x
. Następnie możesz uruchomić skrypt za pomocą polecenia ./nazwa_skryptu.awk [pliki]
.
Na przykład, jeśli masz skrypt o nazwie hello.awk
, który zawiera:
#!/usr/bin/awk -f ROZPOCZNIJ {wydrukuj „Witam”}
Skrypt możesz uruchomić za pomocą następującego polecenia:
./witaj.awk
Które dają:
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
-v
wzmienna=wartość
. Na przykład, jeśli chcesz przekazać dwa argumenty o nazwachvar1
ivar2
dohello.awk
, możesz użyć następującego polecenia:
awk -v var1=witaj -v var2=świat -f witaj.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 ROZPOCZNIJ {drukuj $zmienna1 "" $zmienna2}
Otrzymujesz:
Bonjour Monde
- Druga metoda polega na wykorzystaniu 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
indeksami 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:
Bonjour Monde
Często zadawane pytania
Jaka jest różnica między AWK i GAWK?
GAWK jest implementacją GNU AWK, która dodaje dodatkowe funkcje do oryginalnego języka, takie jak obsługa rozszerzonych wyrażeń regularnych, tablic wielowymiarowych lub predefiniowanych funkcji.
Jak debugować skrypt AWK?
Aby debugować skrypt AWK, możesz użyć -W
parametrem lint
, który wyświetla komunikaty ostrzegawcze o potencjalnych błędach w skrypcie. Można także użyć -W
z dump-variables
, który wyświetla wartości zmiennych na koniec wykonywania skryptu.
Jak używać polecenia AWK do sortowania danych?
Aby użyć polecenia AWK do sortowania danych, możesz użyć sort
w połączeniu z AWK. Na przykład, jeśli chcesz posortować użytkowników w /etc/passwd
według ich UID, możesz użyć następującego polecenia:
awk -F: '{print $1, $3}' /etc/passwd | sortuj -n -k2
Łącząc AWK z innymi poleceniami (tutaj sort
), możesz z łatwością pójść znacznie 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ć specjalnej zmiennej NF
, która zawiera liczbę pól w bieżącej linii oraz specjalnej zmiennej NR
, która zawiera numer aktualnej linii. Używając pętli for, możesz policzyć słowa w każdym wierszu i dodać je do całkowitej
. Korzystając ze specjalnego wzoru END
możesz wydrukować efekt końcowy. 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 wydrukować liczbę słów w pliku za pomocą następującego polecenia:
awk '{for (i=1; i<=NF; i++) suma++} END {wydrukuj sumę}' test.txt
Które dają:
9
Jak użyć polecenia AWK do wyodrębnienia danych z pliku CSV?
Aby użyć polecenia AWK do wyodrębnienia danych z pliku wartości rozdzielanych przecinkami (CSV), możesz użyć -F
, aby ustawić separator pól na przecinek. Na przykład, jeśli masz plik o nazwie test.csv
, który zawiera:
imię, imię, wiek Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
Możesz wyodrębnić imię i wiek osób za pomocą następującego polecenia:
awk -F"," '{print $1 " " $3}' test.csv
Które dają:
imię wiek Alicja 25 Bob 32 Karol 28
Jak filtrować dane za pomocą polecenia AWK?
Polecenie AWK umożliwia filtrowanie danych w oparciu o wzorce, którymi są wyrażenia regularne lub warunki logiczne. Wzory umieszczane są przed akcjami, oddzielone nawiasami klamrowymi. Na przykład, jeśli chcesz wyświetlić w test.csv
zawierające nazwę Alicja
, możesz skorzystać z następującego wzorca:
awk -F"," '/Alice/ {print}' test.csv
Które dają:
Alicja, Dupont, 25
Jeśli chcesz wyświetlić w test.csv
starsze niż 30 lat, możesz zastosować następujący wzór:
awk -F"," '$3 > 30 {print}' test.csv
Które dają:
Bob, Martin, 32
Możesz łączyć wiele wzorców za pomocą operatorów logicznych &&
(i), ||
(lub) i !
(NIE). Na przykład, jeśli chcesz wyświetlić w test.csv
, których nazwa zaczyna się na literę C
lub ma mniej niż 10 lat, możesz użyć następującego wzorca:
awk -F"," '($1 ~ /^C/) || (3 $ < 10) {drukuj}' test.csv
Które dają:
CAMILLE,M,7 CLARA,F,11 KLEMENT,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ć, po prostu użyj zmiennych do przechowywania wartości pośrednich i zaktualizuj je w każdej linii. Korzystając ze specjalnego END
, możemy wyświetlić wynik końcowy. Przykładowo, jeśli chcesz obliczyć sumę i średnią wieku w test.csv
, możesz skorzystać z następującego programu:
awk -F"," 'NR>1 {suma+=3$; liczba++} END {drukuj "Suma: " suma; print 'Średnia: 'suma/liczba}' test.csv
Które dają:
Suma: 110 Średnia: 18,3333
Wyjaśnienia:
- Używamy
-F","
aby zdefiniować separator pól jako przecinek. - Używamy warunku
NR>1,
aby zignorować pierwszą linię pliku, która zawiera nazwy kolumn. -
sumy
iliczby
wieków używamy Używamy+=
do zwiększania zmiennych o wartość trzeciego pola ($3
). - Aby wyświetlić wynik końcowy, używamy
END
Używamy/
do obliczenia średniej poprzez podzielenie sumy przez liczbę.
Podobnie, jeśli chcesz obliczyć minimalny i maksymalny wiek pliku test.csv
, możesz skorzystać z następującego programu:
awk -F"," 'NR>1 {if (min=="") min=max=3$; jeśli (3 dolary max) max=3$} END {wydrukuj "Min: " min; print 'Max: 'max}' test.csv
Które dają:
Min.: 6 Maks.: 32
Wyjaśnienia:
- Używamy
-F","
aby zdefiniować separator pól jako przecinek. - Używamy warunku
NR>1,
aby zignorować pierwszą linię pliku, która zawiera nazwy kolumn. - Używamy
min
imax
do przechowywania minimalnego i maksymalnego wieku. Inicjujemy te zmienne wartością trzeciego pola ($3
), jeśli są puste (""
).<
i>
używamy do porównywania wartości i w razie potrzeby aktualizacji zmiennych. - Aby wyświetlić wynik końcowy, używamy
END
Wniosek
Polecenie AWK jest niezbędnym narzędziem do manipulowania tekstami pod Linuksem. Umożliwia wykonanie skomplikowanych zadań w kilku linijkach kodu, takich jak wyodrębnianie, filtrowanie, modyfikowanie czy obliczanie danych. Oferuje dużą elastyczność dzięki swoim wzorcom, działaniom, funkcjom i zmiennym. Można go łączyć z innymi poleceniami systemu Linux, aby rozszerzyć jego możliwości. Na przykład możesz użyć polecenia Echo w Windows , aby wyświetlić komunikat lub zmienną na ekranie. Jeśli chcesz dowiedzieć się więcej na temat polecenia AWK, możesz zapoznać się z instrukcją lub wieloma tutorialami dostępnymi w Internecie.