- Zeskanuj pliki linia po linii.
- Podziel każdą linię na pola/kolumny.
- Określ wzory i porównaj linie pliku z tymi wzorami
- Wykonuj różne czynności na liniach pasujących do danego wzoru given
W tym artykule wyjaśnimy podstawowe użycie polecenia awk i jak można go użyć do dzielenia pliku łańcuchów. Wykonaliśmy przykłady z tego artykułu na systemie Debian 10 Buster, ale można je łatwo replikować w większości dystrybucji Linuksa.
Przykładowy plik, którego będziemy używać
Przykładowy plik łańcuchów, którego użyjemy, aby zademonstrować użycie polecenia awk, jest następujący:
Oto, co wskazuje każda kolumna przykładowego pliku:
- Pierwsza kolumna zawiera nazwiska pracowników/nauczycieli w szkole
- Druga kolumna zawiera przedmiot, którego uczy pracownik
- Trzecia kolumna wskazuje, czy pracownik jest profesorem czy adiunktem
- Czwarta kolumna zawiera wynagrodzenie pracownika
Przykład 1: Użyj Awk do wydrukowania wszystkich wierszy pliku
Drukowanie każdego wiersza określonego pliku jest domyślnym zachowaniem polecenia awk. W poniższej składni polecenia awk nie określamy żadnego wzorca, który powinien wydrukować awk, dlatego polecenie ma zastosować akcję „print” do wszystkich wierszy pliku.
Składnia:
$ awk 'print' nazwa pliku.tekstPrzykład:
W tym przykładzie mówię poleceniu awk, aby wypisało zawartość mojego przykładowego pliku wiersz po wierszu.
$ awk 'print' przykładowy_plik.tekst
Przykład 2: Użyj awk, aby wydrukować tylko te wiersze, które pasują do danego wzorca
Za pomocą awk możesz określić wzorzec, a polecenie wypisze tylko linie pasujące do tego wzorca.
Składnia:
$ awk '/wzorzec_do_dopasowania/print' nazwa pliku.tekstPrzykład:
Z przykładowego pliku, jeśli chcę wydrukować tylko wiersze zawierające zmienną „B”, mogę użyć następującego polecenia:
$ awk '/B/ print' przykładowy_plik.tekst
Aby przykład był bardziej znaczący, pozwolę sobie wydrukować tylko informacje o pracownikach, którzy są „profesorami”.
$ awk '/professor/ print' przykładowy_plik.tekst
Polecenie drukuje tylko wiersze/wpisy zawierające ciąg „profesor”, dzięki czemu mamy bardziej wartościowe informacje pochodzące z danych.
Przykład 3. Użyj awk, aby podzielić plik tak, aby drukowane były tylko określone pola/kolumny
Zamiast drukować cały plik, możesz sprawić, by awk wypisał tylko określone kolumny pliku. Awk domyślnie traktuje wszystkie słowa oddzielone spacją w wierszu jako rekord kolumny record. Przechowuje rekord w zmiennej $N. Gdzie $1 reprezentuje pierwsze słowo, $2 przechowuje drugie słowo, $3 czwarte i tak dalej. $0 przechowuje całą linię, więc wydrukowana jest linia who, jak wyjaśniono w przykładzie 1.
Składnia:
$ awk 'print $N,.. .' Nazwa pliku.tekstPrzykład:
Następujące polecenie wyświetli tylko pierwszą kolumnę (nazwa) i drugą kolumnę (temat) mojego przykładowego pliku:
$ awk 'print $1, $2' sample_file.tekst
Przykład 4: Użyj Awk, aby policzyć i wydrukować liczbę wierszy, w których dopasowany jest wzorzec
Możesz nakazać awk zliczenie liczby wierszy, w których dopasowany jest określony wzorzec, a następnie wypisanie tego „liczba”.
Składnia:
$ awk '/pattern_to_be_matched/++cnt END print "Count = ", cnt'Nazwa pliku.tekst
Przykład:
W tym przykładzie chcę policzyć liczbę osób uczących przedmiotu „angielski”. Dlatego powiem poleceniu awk, aby pasowało do wzorca „angielski” i wypisał liczbę wierszy, w których ten wzorzec jest dopasowany.
$ awk '/english/++cnt END print "Count = ", cnt' sample_file.tekst
Liczba tutaj sugeruje, że 2 osoby uczą angielskiego z przykładowych zapisów pliku.
Przykład 5: Użyj awk, aby wydrukować tylko wiersze zawierające więcej niż określoną liczbę znaków
W tym zadaniu użyjemy wbudowanej funkcji awk o nazwie „długość”. Ta funkcja zwraca długość ciągu wejściowego. Tak więc, jeśli chcemy, aby awk wypisywał tylko wiersze o większej lub nawet mniejszej liczbie znaków, możemy użyć funkcji length w następujący sposób:
Do drukowania wierszy ze znakami większymi niż liczba:
$ awk 'length($0) > n' nazwa pliku file.tekstDo drukowania wierszy ze znakami mniejszymi niż liczba:
$ awk 'długość($0) < n' filename.txtGdzie n to liczba znaków, które chcesz określić w wierszu.
Przykład:
Następujące polecenie wyświetli tylko wiersze z mojego przykładowego pliku, które mają więcej niż 30 znaków:
$ awk 'długość($0) > 30' przykładowy_plik.tekst
Przykład 6: Użyj awk, aby zapisać wynik polecenia w innym pliku
Używając operatora przekierowania '>', możesz użyć polecenia awk, aby wydrukować wyjście do innego pliku. Oto sposób, w jaki możesz go użyć:
$ awk nazwa pliku „kryteria_do_drukowania”.txt > plik wyjściowy.tekstPrzykład:
W tym przykładzie użyję operatora przekierowania z moim poleceniem awk, aby wydrukować tylko imiona i nazwiska pracowników (kolumna 1) do nowego pliku:
$ awk 'print $1' sample_file.txt > nazwiska pracowników.tekst
Sprawdziłem komendami cat, że nowy plik zawiera tylko imiona i nazwiska pracowników.
Przykład 7: Użyj awk do wypisania tylko niepustych wierszy z pliku
Awk ma kilka wbudowanych poleceń, których można użyć do filtrowania danych wyjściowych. Na przykład polecenie NF służy do zliczania pól w bieżącym rekordzie wejściowym. Tutaj użyjemy polecenia NF, aby wydrukować tylko niepuste wiersze pliku:
$ awk 'NF > 0' przykładowy_plik.tekstOczywiście możesz użyć następującego polecenia, aby wydrukować puste wiersze:
$ awk 'NF < 0' sample_file.txtPrzykład 8: Użyj awk do policzenia wszystkich wierszy w pliku
Inna wbudowana funkcja o nazwie NR zlicza liczbę rekordów wejściowych (zwykle wierszy) danego pliku. Możesz użyć tej funkcji w awk w następujący sposób, aby zliczyć liczbę wierszy w pliku:
$ awk 'END print NR ' przykładowy_plik.tekst
To były podstawowe informacje potrzebne do rozpoczęcia dzielenia plików za pomocą polecenia awk. Możesz użyć kombinacji tych przykładów, aby pobrać bardziej znaczące informacje z pliku łańcuchów za pomocą awk.