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