W systemie Linux, awk to niezwykle wszechstronne narzędzie do przetwarzania tekstu w wierszu poleceń, a jednocześnie rozbudowany język skryptowy. W tym artykule przedstawimy niektóre z jego najciekawszych funkcji.
Pochodzenie nazwy awk
Nazwa polecenia awk pochodzi od inicjałów trzech osób, które stworzyły jego pierwszą wersję w 1977 roku: Alfred Aho, Peter Weinberger oraz Brian Kernighan. Wszyscy trzej byli związani z legendarnymi Bell Laboratories w AT&T, które odegrały kluczową rolę w rozwoju systemu Unix. Od tego czasu awk przeszedł wiele zmian, z udziałem licznych programistów.
To zaawansowany język skryptowy, który jednocześnie stanowi kompletny zestaw narzędzi do manipulacji tekstem w wierszu poleceń. Jeżeli ten artykuł wzbudził Twoje zainteresowanie, możesz przeczytać więcej o wszystkich możliwościach, jakie oferuje awk.
Zasady, wzorce i operacje
awk działa na podstawie programów składających się z reguł, które zawierają wzorce oraz działania. Akcja jest wykonywana na tekście, który odpowiada wzorcowi. Wzorce umieszczane są w nawiasach klamrowych ({}). Razem wzorzec i akcja tworzą regułę. Cały program awk musi być otoczony pojedynczymi cudzysłowami (’).
Rozważmy najprostszy przykład programu awk. W tym przypadku nie ma wzorca, co oznacza, że będzie on pasować do każdej linii tekstu, która zostanie mu przekazana. Oznacza to, że akcja będzie wykonywana dla każdej linii. Można zastosować go do wyjścia z polecenia who.
Oto standardowe wyjście polecenia who:
who
Możliwe, że nie potrzebujemy wszystkich informacji, które się tam znajdują, a jedynie chcemy zobaczyć nazwy użytkowników. Możemy przekazać wyjście z who do awk i polecić mu, aby wyświetlił tylko pierwsze pole.
Domyślnie awk traktuje pole jako ciąg znaków, który jest otoczony białymi znakami, początkiem lub końcem wiersza. Pola są oznaczane za pomocą znaku dolara ($) oraz numeru. Tak więc $1 reprezentuje pierwsze pole, a my użyjemy akcji print do wyświetlenia jego zawartości.
Wpisujemy:
who | awk '{print $1}'
awk wypisuje pierwsze pole, ignorując resztę linii.
Możemy również wydrukować kilka pól naraz. Jeśli oddzielimy je przecinkiem, awk wstawi spację między każdym z nich.
Wpisujemy także, aby wyświetlić godzinę zalogowania (czwarte pole):
who | awk '{print $1,$4}'
Istnieje także szereg specjalnych identyfikatorów pól, które reprezentują cały wiersz tekstu oraz ostatnie pole:
$0: reprezentuje cały wiersz tekstu.
$1: reprezentuje pierwsze pole.
$2: reprezentuje drugie pole.
$7: reprezentuje siódme pole.
$45: reprezentuje czterdzieste piąte pole.
$NF: oznacza „liczbę pól” i reprezentuje ostatnie pole.
Przykładowo, aby wyświetlić fragment tekstu z cytatem Dennisa Ritchie, wpisujemy:
cat dennis_ritchie.txt
Chcemy, aby awk wyświetlił pierwsze, drugie oraz ostatnie pole cytatu. Warto zauważyć, że mimo iż tekst jest zawinięty w oknie terminala, to w rzeczywistości stanowi jedną linię.
Wpisujemy następujące polecenie:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Nie interesuje nas konkretna „prosta” wartość. To jest 18. pole w danym wierszu, ale nas to nie obchodzi. Ważne, że jest to ostatnie pole, a my możemy skorzystać z $NF, aby uzyskać jego wartość. Kropka jest traktowana po prostu jako kolejny znak w zdaniu.
newsblog.pl