J˛ezyk AWK
Transkrypt
J˛ezyk AWK
J˛ezyk AWK Kurs systemu UNIX 1 AWK • Opracowany w laboratoriach Bella w 1978 przez Aho, Weinbergera i Kernighana • J˛ezyk do przetwarzania plików tekstowych Kurs systemu UNIX 2 AWK: pierwsza odsłona! • AWK jest j˛ezykiem programowania • Można go jednak traktować jako proste połaczenie ˛ funkcjonalności nast˛epujacych ˛ programów: – grep, do wybierania interesujacych ˛ linii, – cut, do wybierania interesujacych ˛ kolumn, – tr -s [:blank:], ponieważ domyślnym separatorem jest ciag ˛ spacji i tabulacji. Kurs systemu UNIX 3 Czy AWK jest przestarzały? • Czy prawda˛ jest, że: AWK < Perl < Python • Chyba nie: AWK-a łatwiej si˛e nauczyć, do małych zadań bardzo cz˛esto wystarcza Kurs systemu UNIX 4 Pliki, rekordy, pola • podstawowymi parametrami awk sa˛ pliki do przetworzenia. • Pliki podzielone sa˛ na wiersze (rekordy), wiersze zaś na pola. • Domyślnym separatorem jest ciag ˛ białych znaków. • Oczywiście separatorem może być dowolny znak. • W takim formacie przechowywana jest wi˛ekszość unixowych plików konfiguracyjnych. Taki format maja˛ również bardzo cz˛esto dane wyjściowe poleceń (np. ls) Kurs systemu UNIX 5 Program w awk • Podstawowy program: /wzorzec1/{akcja1} /wzorzec2/{akcja2} /wzorzec3/{akcja3} • Dla każdej linijki, jeżeli pasuje ona do wzorca to wykonana jest odpowiednia akcja. • Wzorcem może tekst, może być wyrażenie regularne, w tym miejscu może znaleźć si˛e również dowolny warunek logiczny • Zmienne o nazwach $1, $2, oznaczaja˛ kolejne pola. Można tych zmiennych używać w cz˛eści {akcja}. • Najprostsza akcja to print. Oznacza ona wypisanie całej linii. Kurs systemu UNIX 6 Dost˛ep do pól • Zmienna $1 to pierwsze pole, $2 drugie itd. Cała bieżaca ˛ linia to $0. • Przykład: wybranie z pliku dwóch kolumn i zamiana miejscami. awk '{print $3,$2 }' • powyżej jako filtr, inna możliwość to awk -f program.awk dane_we1 dane_we2 > dane_wy Kurs systemu UNIX 7 Składnia wyrażeń regularnych ^ poczatek ˛ pola $ koniec pola . 1 dowolny znak | alternatywa wzorców * 0 lub wi˛ecej wystapień ˛ tego co przed + 1 lub wi˛ecej wystapień ˛ tego co przed ? 0 lub 1 powtórzenie tewgo co przed [ ] [^abcd] () Kurs systemu UNIX znak z zestawu ([abcd]) znak spoza zestawu nawiasy grupuja˛ podwyrażenia 8 Wyrażenia regularne • Przykład: program wyświetlajacy ˛ te linie, które sa˛ liczbami /^[0-9]+(\.[0-9]+)?$/ { print $0 } • W ten sposób uzyskujemy funkcjonalność programu grep. Kurs systemu UNIX 9 Warunki zamiast wzorców • Zamiast wzorca może pojawić si˛e warunek: awk '$4 > 100 {print $1*$4}' • Inne warunki arytmetyczne: ==, !=, >, <, >=, <= • Zyskujemy w ten sposób funkcjonalność arkusza kalkulacyjnego. Kurs systemu UNIX 10 Arytmetyka • Operatory arytmetyczne: +, -, *, /, % (reszta z dzielenia), ^ (pot˛ega) • Funkcje matematyczne: sin, cos, log, exp, int (cz˛eść całkowita), rand (wartość pseudolosowa) • Nawiasy i priorytety bez niespodzianek. • zm w wyrażeniu oznacza wartość zmiennej ($ niepotrzebny) • Automatyczna konwersja z napisów do liczb: 1 + "123" = 124 1 + "Ala" = 1 Kurs systemu UNIX 11 Zmienne • Przyjmuja˛ wartości liczbowe lub tekstowe • Nie deklaruje si˛e zmiennych (na poczatku ˛ 0 lub "") • Podstawienie: x=x+1 lub x=x x • Zagadka: Jaka jest wartość wyrażenia: ((2*2)(2*2))/4? Kurs systemu UNIX 12 Zmienne. Przykład • Program obliczajacy ˛ sum˛e wielkości plików w kartotece: ls -l | awk '/^-/{licznik = licznik+$5} END {print licznik}' • Wzorce specjalne: BEGIN (przed pierwsza˛ linia˛ pliku) oraz END (po ostatniej). Kurs systemu UNIX 13 Wyrażenia regularne • Przypominamy: wygladaj ˛ a˛ podobnie jak np. w programie sed, grupujemy podwyrażenia za pomoca˛ normalnych nawiasów: "(" oraz ")", niestety nie ma \1, \2, ... • Mozna uzywać dopasowania w warunkach. wzorzec ~ tekst oznacza, że wzorzec pasuje do tekstu, natomiast wzorzec !~tekst wzorzec nie pasuje do tekstu. • Fragment programu /wzorzec/{akcja} można zatem zapisać jako Kurs systemu UNIX 14 $0 ~ wzorzec {akcja} Kurs systemu UNIX 15 Zmienne wewnetrzne NR liczba przeczytanych rekordów FNR to samo, ale w bieżacym ˛ pliku FILENAME nazwa bieżacego ˛ pliku FS separator pol NF liczba pol w bieżacym ˛ rekordzie ARGC liczba argumentów lini poleceń ARGV Tablica argumentów linii poleceń Kurs systemu UNIX 16 Instrukcje strukturalne • instrukcja for. Składnia jak w j˛ezyku C: for(i1;i2;i3){ polecenia } • instrukcja while. Składnia: while(w) { polecenia } • instrukcja if Składnia: if (w) { polecenia } else { polecenia } • next – przejcie do nast. rekordu • polecenie2 nigdy sie nie wykona { polecenie1 next; polecenie2; } Kurs systemu UNIX 17 Tablice • Dynamiczny rozmiar • nie trzeba deklarować • możliwe tablice wielowymiarowe, do których odwołujemy si˛e jak w Pascalu (a[x,y]) • możliwe tablice asocjacyjne (indeksowane słowami) i potem pisać: x="ala"; print a[x]. Kurs systemu UNIX 18 Przykład: odwracanie kolejności wierszy { wiersze[NR] = $0 } END { licznik=NR; while (licznik > 0) { print wiersze[licznik]; licznik--; } } Kurs systemu UNIX 19 for dla tablic • Można przegladać ˛ tablice asocjacyjne. • Składnia: for (z in T) { rob cos dla T[z] } • Działa również dla tablic wielowymiarowych. Kurs systemu UNIX 20 Funkcje • Definicja: function nazwa(lista parametrow) { instrukcje; } • Parametry przekazywane przez wartość. • Zwracane instrukcja˛ return. • Nie ma tych kłopotów z return co w bash-u, można zwracać dowolny napis lub tekst. Kurs systemu UNIX 21 Jak napisać skrypt w awk? • Pierwsza linijka musi wygladać ˛ mniej wi˛ecej tak: #!/usr/local/bin/awk -f • Potem jest normalny program w awk. • Parametry przekazywane sa˛ za pomoca˛ zmiennych ARGC (liczba argumentów) oraz tablicy ARGV (same argumenty). • Te parametry, które nie sa˛ nazwami plików powinny być obsłużone w bloku BEGIN i nast˛epnie skasowane, przykładowo: if ( /-/ ~ ARGV[i] ) { # zapamietaj, ze opcja i jaka ARGV[i] = ""; } Kurs systemu UNIX 22 Funkcje dzialajace na tekstach • length – długość tekstu. • gsub(r,s,t) – podstawia ciag ˛ tekstowy t w ciagu ˛ s za każdym razem, gdy pasuje wyrażenie regularne r i zwraca liczb˛e dokonanych podstawień. • split(tekst, T, znak) dzieli tekst na na cz˛eści, które umieszcza w tablicy, zwraca ich liczb˛e. Przykładowo split("5-10-01",T,-") zwróci wartość 3, a ponadto ustali: T[1]="5", T[2]="10", T[3]="01" • substr(s,m,n) – oznacza n znaków z s poczynajac ˛ od znaku m-tego, przy czym numeracja jest od 1. Kurs systemu UNIX 23 Zastosowanie length • Za pomoca˛ funkcji length można liczyć znaki w pliku. • Przykładowo: { len += 1+length($0) } END {print "Znaków w pliku jest " len;} • Rozwijajac ˛ ten program w stron˛e wc dodalibyśmy: { wc += NF; } • Linie już sa˛ liczone: robi to zmienna NR. Kurs systemu UNIX 24 Przykłady na gsub • Można używać wersji dwuargumentowej, wtedy to w czym zmieniamy to $0. • Można pisać filtry w ten sposób: { gsub(/[0-9]+\.[0-9]+ /, "<real>") gsub(/[0-9]+ /,"<int> "); print ; # czyli print $0 } • Program linijk˛e 23.5 45.5 45 i tak dalej Kurs systemu UNIX 25 zmienia na <real> <real> <int> i tak dalej • sub działa podobnie, ale podstawienie tylko raz. • Dla gsub trzyargumentowego: zm="abrakadabra"; naCo = "ba"; gsub(/a(b|d)/,naCo,zm); print zm; wypisze tekst: barakbabara. Kurs systemu UNIX 26 I tu w zasadzie moglibyśmy zakończyć Kurs systemu UNIX 27 Ale że zostało jeszcze troch˛e czasu... To omówimy Kurs systemu UNIX 28 Inne funkcje zwiazane ˛ z zamienianiem • index(s,t) zwraca pozycj˛e, na której po raz pierwszy w ciagu ˛ s pojawił si˛e podciag ˛ t, czyli np. index("c","Rumcajs") zwraca 4. • Jeżeli podciag ˛ nie zostanie znaleziony to zwrócona zostanie wartość 0. • Podobne działa funkcja match(s,t), ale pierwszy argument jest wyrażeniem regularnym. • Wynik jest przechowywany w zmiennej RSTART, a długość dopasowanego fragmentu w zmiennej RLENGTH. Kurs systemu UNIX 29 Przykład • Zadanie: chcemy zmienić każda˛ liczb˛e całkowita˛ n w tekście na tekst n (naprawd¦ n!). Kurs systemu UNIX 30 • Rozwiazanie: ˛ while ( match(/[0-9]+ /, linia) != 0) { fragment = substr(linia,RSTART,RLENGTH-1); ile_zostalo = length(linia) - (RSTART+RLENGTH-1); linia = substr(linia,RSTART,ile_zostalo); wynik = wynik fragment " (naprawd¦ " fragment "!)" ; } wynik = wynik linia; • Filtr ten zmieni zdanie: Pilni studenci dostan¡ 5 a leniwi 2 na zdanie Kurs systemu UNIX 31 Pilni studenci dostan¡ 5 (naprawde 5!) a leniwi 2 (naprawde 2!) Kurs systemu UNIX 32