You are on page 1of 21

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

sed i awk
Autorzy: Dale Dougherty, Arnold Robbins
Tumaczenie: Wojciech Derechowski
ISBN: 83-7197-540-6
Tytu oryginau: sed & awk, Second Edition
Format: B5, stron: 384

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Jest to ksika o narzdziowych programach UNIX, nazywanych dziwnie sed i awk.


Programy te maj ze sob wiele wsplnego, zwaszcza uycie wyrae regularnych dla
dopasowywania wzorcw. Poniewa dopasowywanie wzorcw jest tak wane w
stosowaniu obydwu programw, ksika bardzo wyczerpujco wyjania skadni
wyrae regularnych UNIX. Skoro w uczeniu si naturalny jest postp od grep, poprzez
sed do awk, wic bdziemy zajmowa si wszystkimi trzema programami, cho
skupimy si na sed i awk.
Sed i awk s narzdziami stosowanymi przez uytkownikw, programistw
i administratorw -- przez kadego, kto pracuje z plikami tekstowymi. Sed, nazywany
tak ze wzgldu na to, e jest edytorem strumieniowym, doskonale nadaje si
wprowadzania cigu poprawek (ang. edits) do wielu plikw. Awk, ktrego twrcami
s Aho, Weinberger i Kernighan (skd pochodzi nazwa) jest jzykiem programowania
umoliwiajcym atwe dziaania na danych, ktre maj struktur i tworzenie
sformatowanych raportw. Ksika kadzie nacisk na definicj POSIX dla awk.
Prcz tego opisuje krtko pierwsz wersj awk przed omwieniem trzech wersji awk
dostpnych bezpatnie oraz dwch bdcych w sprzeday, z ktrych wszystkie s
implementacjami POSIX awk.
Ksika skupia uwag na pisaniu dla sed i awk skryptw, stanowicych szybkie
rozwizanie wybranych problemw uytkownika. Wiele ze skryptw tego rodzaju
mona okreli jako dorane rozwizanie. Prcz tego opiszemy skrypty, ktre
rozwizuj wiksze problemy, wymagaj wic bardziej starannego projektowania
i programowania.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl




Zakres podrcznika .................................................................................................................... 7
Dostpno sed i awk................................................................................................................. 8
Jak uzyska przykadowy kod rdowy ................................................................................. 12
Konwencje stosowane w podrczniku..................................................................................... 14
O drugim wydaniu ................................................................................................................... 15
Podzikowania z pierwszego wydania .................................................................................... 16

 
   


Oby rozwizywa ciekawe zadania ........................................................................................ 17
Edytor strumieniowy ............................................................................................................... 19
Jzyk programowania z dopasowaniem wzorcw................................................................... 20
Cztery przeszkody w mistrzostwach sed i awk ....................................................................... 21

 
     


Od ed poprzez grep i sed do awk............................................................................................. 23
Skadnia wiersza polece......................................................................................................... 28
Uycie sed................................................................................................................................ 30
Uycie awk .............................................................................................................................. 33
Uycie sed wraz z awk............................................................................................................. 36

 
      !"# 

$
To jest wyraenie ..................................................................................................................... 40
Znaki w szyku.......................................................................................................................... 42
Mnie podoba si wszystko....................................................................................................... 65



 %
    &

'
Stosowanie polece w skrypcie ............................................................................................... 68
Adresowanie w perspektywie globalnej .................................................................................. 70
Testowanie i zapis danych wyjcia.......................................................................................... 72
Cztery typy skryptw sed ........................................................................................................ 75
W drodze do Ziemi Obiecanej ................................................................................................ 86

 (
 # 

)$
O skadni polece sed .............................................................................................................. 89
Komentarz................................................................................................................................ 90
Podstawianie ............................................................................................................................ 91
usu .......................................................................................................................................... 96
dopisz, wstaw i zamie ............................................................................................................ 97
wylistuj................................................................................................................................... 100
transformuj............................................................................................................................. 103
drukuj ..................................................................................................................................... 103
drukuj numer wiersza ............................................................................................................ 104
nastpny ................................................................................................................................. 105
Odczyt i zapis do plikw ....................................................................................................... 106
zakocz .................................................................................................................................. 113

 '
   # 

(
Wielowierszowa przestrze wzorca ...................................................................................... 116
Przypadek do zbadania .......................................................................................................... 124
Utrzymuj wiersz..................................................................................................................... 127
Zaawansowane polecenia sterowania przepywem ............................................................... 134
Szkoda sw .......................................................................................................................... 139

 
    &#  

%
Zasady gry.............................................................................................................................. 143
Witajcie wszyscy ................................................................................................................... 144
Model programowania awk ................................................................................................... 145
Dopasowanie wzorca ............................................................................................................. 146
Rekordy i pola........................................................................................................................ 148
Wyraenia .............................................................................................................................. 152
Zmienne systemowe .............................................................................................................. 156
Operatory relacyjne i logiczne............................................................................................... 161


 

Drukowanie formatowane ..................................................................................................... 167


Przekazywanie parametrw do skryptu ................................................................................. 169
Pobieranie informacji............................................................................................................. 171

 )
*   +#  ,# 

 (
Instrukcje warunkowe............................................................................................................ 175
Ptle ....................................................................................................................................... 177
Inne instrukcje wpywajce na sterowanie przepywem ....................................................... 182
Tablice ................................................................................................................................... 184
Procesor akronimw .............................................................................................................. 194
Zmienne systemowe, ktre s tablicami................................................................................ 199

 $
- 

.
Funkcje arytmetyczne ............................................................................................................ 203
Funkcje acuchw ................................................................................................................ 208
Pisanie wasnych funkcji ....................................................................................................... 216

 .
/# 0# 

(
Funkcja getline....................................................................................................................... 225
Funkcja close()....................................................................................................................... 229
Funkcja system().................................................................................................................... 230
Generator polece oparty na systemie menu ......................................................................... 232
Kierowanie wyjcia do plikw i potokw ............................................................................. 236
Generowanie raportw w kolumnach.................................................................................... 239
Debugging.............................................................................................................................. 242
Ograniczenia .......................................................................................................................... 246
Wywoanie awk za pomoc skadni #! .................................................................................. 247

 
   

(
Oryginalny awk...................................................................................................................... 251
Bezpatnie dostpne wersje awk............................................................................................ 254
Komercyjne wersje awk ........................................................................................................ 267
Epilog..................................................................................................................................... 271

 
 # 

 
Interaktywny program do sprawdzania pisowni.................................................................... 273
Generowanie formatowanego indeksu .................................................................................. 285
Dalsze szczegy programu masterindex .............................................................................. 308



 
1,& &


utot.awk podaj statystyk UUCP...................................................................................... 313
phonebill nadzoruj uycie telefonu................................................................................... 316
combine odzyskaj binaria z wieloczciowej postaci uuencode ...................................... 319
mailavg sprawd wielko skrzynek pocztowych ............................................................ 320
adj nastaw wiersze plikw tekstowych............................................................................. 321
readsource Formatuj pliki rdowe programu dla troff .................................................. 327
gent pobierz wpis termcap ................................................................................................ 332
plpr preprocesor lpr........................................................................................................... 334
transpose wykonaj transpozycj macierzy ....................................................................... 336
m1 prosty makroprocesor ................................................................................................. 338

/   

%(
/  2  

(
/  34# 

'
4  

 $

Zaczynajc nauk sed i awk, warto zobaczy, jak wiele wsplnych cech maj oba programy.
Uruchamiane s przy uyciu podobnej skadni.
Oba s zorientowane strumieniowo, odczytuj dane wejciowe z plikw tekstowych po jednym
wierszu na raz i kieruj wynik na wyjcie standardowe.
Uywaj wyrae regularnych przy dopasowywaniu wzorcw.
Pozwalaj uytkownikowi na dostarczanie instrukcji w postaci skryptu.
Jednym z powodw tylu podobiestw jest to, e rde obydwu programw naley szuka w tym
samym edytorze wierszowym ed. Rozdzia zaczynamy rzutem oka na ed i pokazujemy, e sed i awk
zmierzay logicznie do stworzenia edytora programowalnego.
Tym, co rni sed i awk, jest rodzaj instrukcji, ktre kontroluj ich prac. Nie udmy si jest to
wielka rnica i ma wpyw na rodzaje zada, jakie najlepiej jest wykonywa za pomoc tych programw.
Obecny rozdzia dotyczy skadni wiersza polece sed i awk, oraz podstawowej struktury skryptw.
Zawiera take wiczenie z uyciem listy adresowej, w ktrym bdziemy mogli poprbowa pisania skryptw. Warto przyjrze si skryptom sed i awk obok siebie, zanim skupimy si na ktrym
z tych programw.

Rodowd awk mona wywie od sed i grep, i poprzez oba te programy od ed, pierwszego
edytora wierszowego UNIX.
Czy kiedykolwiek Czytelnik uywa edytora wierszowego? Jeeli tak, atwiej zrozumie wierszow
orientacj sed i awk. Czytelnik, ktry uywa vi, edytora ekranowego, zna liczne polecenia wywodzce si z lecego u podoa vi edytora wierszowego ex (ktry jest nadzbiorem wasnoci nalecych do ed).


  









 

Przyjrzyjmy si pewnym podstawowym operacjom, uywajc edytora wierszowego ed. Bez obaw
jest to wiczenie, ktre ma nam pomc w nauce sed i awk, a nie by prb przekonania nas
o urokach edytorw wierszowych. Polecenia ed, pokazane w tym wiczeniu, s identyczne z poleceniami sed, ktrych Czytelnik nauczy si pniej. Mona oczywicie eksperymentowa z ed na
wasn rk, aby przekona si jak on dziaa. (Jeli Czytelnik zna ju ed, moe pomin poniszy
punkt rozdziau.)
W edytorze wierszowym pracujemy nad jednym wierszem naraz. Wane jest, by wiedzie, przy
ktrym wierszu w pliku jestemy. Kiedy otwieramy plik za pomoc ed, wywietla on liczb znakw pliku i ustawia si w ostatnim wierszu:
$ ed test
339

Nie ma zgoszenia gotowoci. Jeli napiszemy polecenie, ktrego ed nie rozumie, drukowany jest
znak zapytania jako komunikat o bdzie. Mona napisa polecenie drukuj, p, by wywietli biecy wiersz:
p
label on the first box.

Polecenie edytuje domylnie tylko wiersz biecy. eby zrobi poprawk przechodzimy do wiersza, ktry chcemy edytowa, a nastpnie stosujemy polecenie. Aby przej do wiersza, podajemy
jego adres. Adres moe skada si z numeru wiersza, z symbolu wskazujcego pewne miejsce
w pliku bd z wyraenia regularnego. Do pierwszego wiersza przechodzimy, wpisujc numer
wiersza 1. Nastpnie moemy napisa polecenie usu, aby ten wiersz usun:
1
You might think of a regular expression
d

Wpisanie 1 sprawia, e pierwszy wiersz staje si wierszem biecym i jest wywietlany na ekranie. Poleceniem usu w ed jest d, usuwa wic powyej wiersz biecy. Zamiast przechodzi do
wiersza i nastpnie edytowa ten wiersz, mona zaopatrzy polecenie edycji w przedrostek, adres,
ktry wskazuje, jaki wiersz lub zakres wierszy jest przedmiotem polecenia. Jeeli napiszemy 1d,
zostanie usunity pierwszy wiersz.
Jako adres mona take poda wyraenie regularne. Aby usun wiersz zawierajcy sowo regular,
wydajemy takie polecenie:
/regular/d

gdzie prawe ukoniki ograniczaj wyraenie regularne, a regular jest acuchem, ktry chcemy
dopasowywa. Polecenie to usuwa pierwszy wiersz, ktry zawiera regular, oraz sprawia, e wiersz
nastpujcy po nim staje si wierszem biecym.
Wane jest, by rozumie, e polecenie usu usuwa wiersz w caoci. Nie usuwa samego
tylko sowa regular z tego wiersza.




  



 
 







Aby usun wszystkie wiersze zawierajce wyraenie regularne, polecenie zaopatruje si w przedrostek, liter g jak globalnie:
g/regular/d

Polecenie globalne sprawia, e wszystkie wiersze, ktre pasuj do wyraenia regularnego, staj si
przedmiotem wyspecyfikowanych polece.
Oto, gdzie najdalej moe nas doprowadzi usuwanie tekstu. Podstawianie tekstu (zastpowanie
jednej czstki tekstu przez inn) jest znacznie ciekawsze. Poleceniem podstaw, s, w ed jest:
[adres]s/wzorzec/zamiennik/znacznik_operacji

wzorzec jest wyraeniem regularnym, ktre w biecym wierszu dopasowuje acuch, jaki naley
zastpi zamiennikiem. Na przykad, ponisze polecenie zastpuje pierwsze wystpienie acucha
regular przez complex w biecym wierszu:
s/regular/complex/

Adres nie jest wyspecyfikowany, wic to polecenie edytuje tylko pierwsze wystpienie acucha
w biecym wierszu. Jeli regular nie daje si odszuka w biecym wierszu, jest to bd. Aby
wyszukiwa wielokrotne wystpienia acucha w tym samym wierszu, naley poda g jako znacznik operacji (ang. flag):
s/regular/complex/g

Polecenie to zmienia wszystkie wystpienia w biecym wierszu. Aby dziaanie tego polecenia
skierowa na wicej wierszy, ni tylko wiersz biecy, naley wyspecyfikowa adres. Nastpujce
polecenie podstaw specyfikuje adres:
/regular/s/regular/complex/g

Polecenie to edytuje pierwszy wiersz, ktry w pliku pasuje do adresu. Naley pamita, e pierwszy acuch regular jest adresem, a drugi wzorcem do dopasowania przez polecenie podstaw.
Aby zastosowa je do wszystkich wierszy trzeba uy polecenia globalnego, wstawiajc g przed
adresem.
g/regular/s/regular/complex/g

Teraz podstawienie wykonywane jest wszdzie obejmuje wszystkie wystpienia we wszystkich


wierszach.
Zwrmy uwag na rne znaczenia g. Na pocztku g jest poleceniem globalnym
oznaczajcym: zrb zmiany we wszystkich wierszach dopasowanych przez adres. Na kocu
g jest znacznikiem operacji, ktry oznacza: zmie kade wystpienie w wierszu, nie tylko
pierwsze.

Adres i wzorzec nie musz by identyczne:


g/regular expression/s/regular/complex/g


  









 

W kadym wierszu, ktry zawiera acuch regular expression zastp regular przez complex.
Jeeli adres i wzorzec s identyczne, mwimy o tym ed, podajc kolejno dwa ograniczniki (//).
g/regular/s//complex/g

W tym przykadzie regular specyfikuje si jako adres, a wzorzec, ktry ma by dopasowany


przy podstawianiu, jest identyczny z adresem. Jeli Czytelnikowi wydaje si, e omwilimy te
polecenia popiesznie, a trzeba przyswoi sobie bardzo wiele, nie musi si martwi. Wrcimy do
nich pniej.
Znane narzdzie systemu UNIX, grep, wywodzi si z nastpujcego polecenia globalnego w ed:
g/re/p

na oznaczenie global regular expression print. Grep jest poleceniem edycji wierszowej, wydzielonym z ed i udostpnionym jako zewntrzny program. Jest przeznaczone do wykonywania
pojedynczego polecenia edycji. Jako argument przyjmuje w wierszu polece wyraenie regularne
i uywa go jako adresu wierszy do wydrukowania. Oto przykad wyszukiwania wierszy pasujcych do box:
$ grep 'box' test
You are given a series of boxes, the first one labeled "A",
label on the first box.

Drukuje on wszystkie wiersze pasujce do wyraenia regularnego.


Jedn z ciekawszych cech ed jest to, e moemy napisa skrypt z poprawkami, umieci je
w osobnym pliku i skierowa ten plik na wejcie edytora wierszowego. Na przykad, jeeli cig
polece zostaby umieszczony w pliku o nazwie ed-script, nastpujce polecenie wykonywaoby
ten skrypt.
ed test < ed-script

Wasno ta sprawia, e ed jest edytorem programowalnym, to znaczy, e moemy napisa skrypt


dowolnych dziaa, ktre moglibymy wykona rcznie.
Sed zosta stworzony jako wyspecjalizowany edytor, wycznie do wykonywania skryptw; w przeciwiestwie do ed nie moe by uywany interaktywnie. Sed rni si od ed tym, e jest zorientowany strumieniowo. Domylnie wszelkie dane wejcia przepywaj przez sed i s kierowane na
wyjcie standardowe. Sam plik wejciowy nie jest poddawany zmianom. Jeeli rzeczywicie
chcemy zmodyfikowa plik wejciowy, stosujemy na og mechanizm shella do przekierowania
wyjcia i gdy stwierdzimy, e poprawki s zadowalajce, zastpujemy pierwotny plik wersj zmodyfikowan.
ed nie jest zorientowany strumieniowo i zmiany przeprowadzane s w samym pliku. Skrypt ed
musi zawiera polecenia zapisania pliku i zakoczenia pracy edytora. Nie wyprowadza na ekran
nic poza tym, co moe by generowane przez ktre z polece.
Strumieniowa orientacja sed ma znaczny wpyw na sposb, w jaki stosowane jest adresowanie.
W ed polecenie bez adresu edytuje tylko biecy wiersz. Sed przechodzi poprzez plik wiersz za
wierszem, tak e kady z wierszy staje si wierszem biecym i do niego stosowane s polecenia.
W rezultacie sed stosuje polecenie bez adresu do kadego wiersza w pliku.




  



 
 







Spjrzmy na nastpujce polecenie podstaw:


s/regular/complex/

Jeeli wpiszemy to polecenie w trybie interaktywnym ed, podstawimy complex za pierwsze wystpienie regular w biecym wierszu. W przypadku skryptu ed, jeli byoby to pierwsze polecenie skryptu, zostaoby zastosowane tylko do ostatniego wiersza pliku (domylnego wiersza biecego ed). W skrypcie sed natomiast to samo polecenie stosuje si do wszystkich wierszy.
Oznacza to, e polecenia sed s domylnie globalne. W sed ostatni przykad daje taki sam wynik,
jak nastpujce globalne polecenie w ed:
g/regular/s//complex

Zrozumienie rnicy pomidzy adresowaniem biecego wiersza w ed i adresowaniem


wierszy globalnie w sed jest bardzo wane. W ed uywa si adresowania, aby powikszy
liczb wierszy, ktre s przedmiotem polecenia w sed adresowania uywa si, by
ograniczy liczb wierszy edytowanych przez polecenie.

Sed zosta ponadto wyposaony w liczne, dodatkowe polecenia, ktre wspomagaj pisanie skryptw. Wieloma z tych polece zajmiemy si w rozdziale 6., Zaawansowane polecenia sed.
Awk zosta opracowany jako programowalny edytor, ktry podobnie jak sed, jest zorientowany
strumieniowo i interpretuje skrypt polece edycji. To, w czym awk odchodzi od sed, polega na zaniedbaniu zbioru polece edytora wierszowego. Zamiast tego awk oferuje jzyk programowania,
wzorowany na jzyku C. Instrukcja print zastpuje na przykad polecenie p. Pojcie adresowania
przenoszone jest tak, e:
/regular/ { print }

drukuje wiersze pasujce do regular. Nawiasy klamrowe ({}) okalaj cig jednej lub wicej instrukcji, ktre s stosowane do jednego adresu.
Zalet uycia w skryptach jzyka programowania jest to, e oferuje on znacznie wicej sposobw
kontrolowania, co moe robi programowalny edytor. Awk oferuje wyraenia, instrukcje warunkowe, ptle i inne konstrukcje programowe.
Jedn z najbardziej znamiennych cech awk jest to, i analizuje on syntaktycznie (ang. parses), albo
inaczej mwic rozdziela, kady wiersz wejcia i umoliwia przetwarzanie za pomoc skryptu poszczeglnych sw. (Edytor taki jak vi rwnie rozpoznaje sowa, pozwalajc porusza si od sowa do sowa bd zrobi sowo przedmiotem dziaania, lecz te wasnoci mog by wykorzystywane tylko interaktywnie).
Chocia awk by projektowany jako programowalny edytor, uytkownicy przekonali si, e
skrypty awk rwnie dobrze mogy speni szeroki zakres innych zada. Autorzy awk nigdy nie sdzili, e bdzie si go stosowa do pisania duych programw. Lecz wobec faktu, e awk by
uywany w taki sposb, autorzy dokonali rewizji jzyka, tworzc nawk, ktry zapewnia lepsze
wsparcie przy pisaniu wikszych programw i rozwizywaniu zada programowania oglnego. Ta
nowa wersja z drobnymi poprawkami jest skodyfikowana przez standard POSIX.


  







 

Sed i awk uruchamia si w bardzo podobny sposb. Oto skadnia wiersza polece:
polecenie [opcje] skrypt nazwa_pliku

Jak niemal wszystkie programy UNIX, sed i awk mog czyta z wejcia standardowego i wysya
dane wyjcia na wyjcie standardowe. Jeeli wyspecyfikowana jest nazwa pliku, wejcie pobierane
jest z tego pliku. Wyjcie zawiera przetworzon informacj. Wyjciem standardowym jest ekran
wywietlacza i na og tam kierowane jest wyjcie programw. Mona je wysa rwnie do pliku
za pomoc przekierowania wejcia-wyjcia w shellu, lecz nie wolno kierowa go do tego samego
pliku, ktry dostarcza programowi danych wejcia.
Dla kadego z polece opcje s rne. Wiele z nich przedstawimy w kolejnych punktach rozdziau. (Pena lista opcji wiersza polece sed znajduje si w dodatku A, Przewodnik sed; pena lista
opcji awk jest w dodatku B, Przewodnik awk.)
Instrukcje do wykonania specyfikuje skrypt. Jeeli skrypt zapisywany jest w wierszu polece, musi by otoczony pojedynczymi cudzysowami, o ile zawiera spacj lub jakikolwiek znak, ktry
mgby by interpretowany przez shell (na przykad $ lub *).
Opcj wspln sed i awk jest opcja -f, ktra pozwala wyspecyfikowa nazw pliku ze skryptem.
Kiedy skrypt si rozrasta, dogodnie jest umieci go w pliku. Tak wic sed mona uruchamia w nastpujcy sposb:
sed -f plik_skryptu plik_wejciowy

Rysunek 2.1 przedstawia podstawowe dziaanie sed i awk. Kady z programw czyta z pliku wejciowego jeden wiersz wejcia naraz, robi kopi tego wiersza i wykonuje instrukcje wyspecyfikowane w skrypcie na tej kopii. Tak wic zmiany dokonane w wierszu wejcia faktycznie nie dotycz pliku wejciowego.



    




  

! 
 
"

#



Skrypt jest miejscem, w ktrym mwimy programowi, co ma robi. Niezbdny jest przynajmniej
jeden wiersz zawierajcy instrukcj. Krtkie skrypty mog by zapisane w wierszu polece; dusze skrypty umieszczane s zwykle w pliku, w ktrym mona je atwo poprawia i testowa.
Piszc skrypt, naley pamita o kolejnoci, w ktrej instrukcje bd wykonywane i o tym, jak
kada instrukcja zmienia wiersz wejcia.
W sed i awk kada instrukcja ma dwie czci: wzorzec i procedur. Wzorzec jest wyraeniem regularnym ograniczonym prawymi ukonikami (/). Procedura specyfikuje jedno lub wicej dziaa,
ktre maj by wykonane.
Kiedy czytany jest kady wiersz wejcia, program czyta pierwsz instrukcj w skrypcie i sprawdza
wzorzec w odniesieniu do biecego wiersza. Jeli wzorzec nie pasuje, procedura jest pomijana
i odczytywana jest nastpna instrukcja. Jeli wzorzec pasuje, przeprowadzane jest dziaanie lub
dziaania wyspecyfikowane przez procedur. Czytane s wszystkie instrukcje, nie tylko pierwsza,
ktra dopasowaa wiersz wejcia.
Gdy wszystkie odpowiednie instrukcje s zinterpretowane i zastosowane do pojedynczego wiersza, sed wyprowadza ten wiersz na wyjcie i powtarza cykl dla kadego wiersza wejcia. Awk,
przeciwnie, nie wyprowadza tego wiersza automatycznie; instrukcje w skrypcie kontroluj to, co
ostatecznie si z nim robi.
Tre procedury jest bardzo rna w sed i w awk. W sed procedura skada si z polece edycji,
takich jak w edytorze wierszowym. Wikszo polece skada si z pojedynczej litery.
W awk procedura skada si z instrukcji jzyka i funkcji. Procedura musi by ujta w nawiasy
klamrowe.
W kolejnych punktach rozdziau przyjrzymy si kilku skryptom, ktre przetwarzaj prost list
adresow.

 
 
Przykady w poniszych podpunktach rozdziau wykorzystuj plik o nazwie list. Zawiera on list
nazwisk i adresw, pokazan poniej:
$ cat list
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

Czytelnik, jeli chce, moe utworzy powyszy plik w swoim systemie albo uy podobnego pliku
wasnego pomysu. Poniewa liczne przykady w tym rozdziale s krtkie i interaktywne, mona
wprowadza je z klawiatury i sprawdza wyniki.


  



$%





 

S dwa sposoby wywoania sed: specyfikujemy instrukcje edycji w wierszu polece lub umieszczamy je w pliku i dostarczamy nazw pliku.

 
 
 
Proste polecenia edycji moemy specyfikowa w wierszu polece:
sed [-e] 'instrukcja' plik

Opcja -e jest niezbdna tylko wtedy, gdy w wierszu polece specyfikuje si wicej ni jedn instrukcj edycji. Opcja ta mwi sed, e nastpny argument powinien by interpretowany jako instrukcja. Przy pojedynczej instrukcji sed jest w stanie ustali to samodzielnie. Przyjrzyjmy si kilku przykadom.
Nastpujcy przykad stosuje polecenie s przy podstawieniu, w ktrym MA jest zastpowane
przez Massachussets w przykadowym pliku wejciowym list:
$ sed 's/MA/Massachusetts/' list
John Daggett, 341 King Road, Plymouth Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston Massachusetts

Trzy wiersze s edytowane przez instrukcj, lecz wszystkie wiersze zostaj wywietlone.
Ujmowanie instrukcji w pojedyncze cudzysowy nie we wszystkich przypadkach jest obowizkowe, powinnimy jednak przyzwyczai si do tego. Pojedyncze cudzysowy okalajce powstrzymuj shell od interpretowania znakw specjalnych lub spacji znajdujcych si w instrukcji edycji.
(Shell uywa spacji do rozrniania poszczeglnych argumentw przekazywanych do programu;
znaki, ktre s specjalne z punktu widzenia shella, rozwijane s przed wywoaniem polecenia.)
Tak wic pierwszy przykad mg by uruchomiony bez nich. Lecz w nastpnym przykadzie s
obowizkowe, gdy polecenie podstaw zawiera spacj.
$ sed 's/MA/, Massachusetts/' list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston, Massachusetts

W celu umieszczenia przecinka pomidzy miastem i stanem instrukcja zastpia spacj przed
dwuliterowym skrtem przez przecinek i spacj.




  

&'


$(

S trzy sposoby, by wyspecyfikowa wiele instrukcji w wierszu polece:


1.

Rozdzieli instrukcje rednikiem:


sed 's/ MA/, Massachusetts/; s/ PA/, Pennsylvania/' list

2.

Poprzedzi kad z instrukcji przez -e:


sed -e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/' list

3.

Skorzysta ze zwielokrotnienia wiersza polece w shellu Bourne'a1. Naciskamy RETURN po


wpisaniu pojedynczego cudzysowu i pojawia si wtedy pomocnicze zgoszenie gotowoci (>)
wejcia dla wielu wierszy.
$ sed '
> s/ MA/, Massachusetts/
> s/ PA/, Pennsylvania/
> s/ CA/, California/
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

Technika ta nie bdzie dziaa w shellu C. Zamiast niej naley uy rednikw na kocu kadej
z instrukcji, a polecenia wpisuje si w wielu wierszach, koczc kady nich lewym ukonikiem.
(Mona te tymczasowo przej do shellu Bourne'a wpisujc sh a potem polecenie.)
W powyszym przykadzie zmiany dokonay si w piciu wierszach i oczywicie wszystkie wiersze zostay wywietlone. Pamitajmy, e nic nie zmienio si w pliku wejciowym.



Skadnia polecenia sed moe by nieugita i atwo jest zrobi bd albo pomin obowizkowy
element. Popatrzmy, co si stanie, gdy uyjemy niekompletnej skadni:
$ sed -s 's/MA/Massachusetts' list
sed: command garbled: s/MA/Massachusetts

Sed wywietla na og kady wiersz, ktrego nie moe wykona, nie mwi jednak, co jest nie
w porzdku z samym poleceniem2. Tutaj na kocu polecenia podstaw brakuje prawego ukonika,
ktry oznacza w poleceniu czci wyszukiwania i zastpowania.
Bardziej pomaga nam GNU sed:
$ gsed -e 's/MA/Massachusetts' list
gsed: Unterminated 's' command

Obecnie istnieje wiele interpreterw, kre s kompatybilne z shellem Bourne'a i dziaaj w opisany tutaj
sposb: ksh, bash, pdksh i zsh, by wymieni tylko kilka z nich.
Pewni producenci staraj si to najwyraniej poprawi. Na przykad w SunOS4.1.x sed komunikuje
sed: Ending delimiter missing on substitution: s/MA/Massachussetts.


  



$





 



Zapisywanie duszych skryptw w wierszu polece jest niepraktyczne. Dlatego najlepiej jest
stworzy plik skryptu zawierajcy instrukcje edycji. Skrypt edycji jest po prostu list polece sed,
ktre s wykonywane w porzdku wystpowania. Forma taka, z uyciem opcji -f, wymaga, abymy wyspecyfikowali w wierszu polece nazw pliku ze skryptem:
sed -f plik_skryptu plik

Wszystkie polecenia edycji, jakie chcemy wykona umieszczone s w pliku. Przestrzegamy konwencji tworzenia pod nazw sedscr tymczasowych plikw ze skryptami.
$ cat sedscr
s/ MA/, Massachusetts/
s/ PA/, Pennsylvania/
s/ CA/, California/
s/ VA/, Virginia/
s/ OK/, Oklahoma/

Ponisze polecenie odczytuje wszystkie polecenia podstaw w sedscr i stosuje je do kadego wiersza pliku wejciowego list:
$ sed -f sedscr list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond, Virginia
Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke, Virginia
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

Raz jeszcze wynik jest ulotny, wywietlany na ekranie. W pliku wejciowym nie robi si adnych
zmian.
Jeeli skrypt z sed nadaje si do uytku, powinnimy zapisa go pod now nazw. Skrypty o sprawdzonej wartoci mona przechowywa w osobistej lub oglnie dostpnej bibliotece.


Jeli nie stosujemy przekierowania wyjcia sed do innego programu, bdziemy chcieli przechwyci dane wyjcia do pliku. Robi si to przez wyspecyfikowanie nazwy pliku poprzedzonej jednym
z symboli shella, oznaczajcych przekierowanie wejcia-wyjcia:
$ sed -f sedscr list > newlist

Nie powinnimy kierowa wyjcia do pliku, ktry jest edytowany pod grob uszkodzenia tego
pliku. (Operator przekierowania > obcina plik, zanim shell zrobi cokolwiek innego.) Jeeli
chcemy, by plik wyjciowy zastpi plik wejciowy moemy to uzyska w osobnym kroku, za
pomoc polecenia mv. Przedtem musimy jednak dobrze sprawdzi, czy skrypt edycji dziaa poprawnie!




  

&'


$$

W rozdziale 4., Pisanie skryptw sed, przyjrzymy si skryptowi shell o nazwie runsed, ktry automatyzuje proces tworzenia pliku tymczasowego oraz uycia mv w celu zatarcia (ang. overwrite)
pierwotnego pliku.

       


Sed domylne wyprowadza na wyjcie kady wiersz wejcia. Opcja -n powstrzymuje automatyczne wyprowadzanie. Kiedy specyfikujemy t opcj, kada instrukcja, ktra powinna wyprowadza
wynik, musi zawiera polecenie drukuj, p. Spjrzmy na nastpujcy przykad:
$ sed -n -e 's/MA/Massechusetts/p' list
John Daggett, 341 King Road, Plymouth Massachusetts
Eric Adams, 20 Post Road, Sudbury Massachusetts
Sal Carpenter, 73 6th Street, Boston Massachusetts

Porwnajmy to wyjcie z pierwszym przykadem w tym punkcie rozdziau. Teraz drukowane s


tylko wiersze, ktre byy edytowane przez polecenie.

  
Moemy zbudowa skrypt, czc uycie opcji -e i -f. Skrypt stanowi kombinacj wszystkich polece
w podanym porzdku. Funkcjonuj tak wersje UNIX sed, ale wasno ta nie jest jasno udokumentowana na stronie podrcznikowej. Standard POSIX wyranie uprawomocnia to postpowanie.

 
Tabela 2.1 podsumowuje opcje wiersza polece sed.
 !"
 "  # 
Opcja

Opis

-e

Poprzedza instrukcj edycji.

-f

Poprzedza nazw pliku ze skryptem.

-n

Powstrzymaj automatyczne wyprowadzanie wierszy wejcia.

Awk, podobnie jak sed, wykonuje zbir instrukcji dla kadego wiersza wejcia. Moemy specyfikowa instrukcje w wierszu polece bd stworzy plik ze skryptem.

 
Dla wierszy polece skadnia jest nastpujca:
awk 'instrukcje' pliki


  



$





 

Dane wejcia czytane s po jednym wierszu naraz, z jednego lub wicej plikw lub z wejcia standardowego. Dla ochrony przed shellem instrukcje musz by ujte w pojedyncze cudzysowy. (Instrukcje niemal zawsze zawieraj nawiasy klamrowe i(lub) znaki dolara, ktre interpretowane s
przez shell jako znaki specjalne.) Mona wpisywa wiele wierszy polece w taki sam sposb, jak
dla sed, rozdzielajc polecenia rednikami lub stosujc zwielokrotnienie wiersza polece w shellu
Bourne'a.
Programy awk umieszcza si zwykle w pliku, gdzie mona je testowa i zmienia. Skadnia dla
wywoania awk z plikiem skryptu jest nastpujca:
awk -f skrypt pliki

Opcja -f dziaa tak samo jak w sed.


Mimo e instrukcje awk maj t sam budow jak w sed, skadajc si z czci wzorca i czci
procedury, procedury s zupenie inne. Awk wyglda w nich mniej jak edytor, a bardziej jak jzyk
programowania. Wystpuj tu instrukcje i funkcje zamiast jedno- lub dwuliterowych sekwencji
polece. Uywamy na przykad instrukcji print, aby wydrukowa warto wyraenia albo zawarto biecego wiersza wejcia.
W zwykym przypadku awk interpretuje kady wiersz wejcia jako rekord i kade sowo w tym
wierszu, ograniczane znakami spacji lub tabulacji, jako pole. (To zachowanie domylne mona
zmieni.) Jeden lub wicej znakw spacji lub tabulacji, wystpujcych kolejno, liczy si jako jeden ogranicznik. Awk pozwala odwoywa si do tych pl we wzorcach bd procedurach. $0
oznacza cay wiersz wejcia. $1, $2... odnosz si do poszczeglnych pl w wierszu wejcia. Awk
rozdziela rekord wejcia przed zastosowaniem skryptu. Przyjrzyjmy si kilku przykadom z uyciem prostego pliku wejciowego list.
Pierwszy przykad zawiera pojedyncz instrukcj, ktra drukuje pierwsze pole kadego wiersza
pliku wejciowego:
$ awk '{ print $1 }' list
John
Alice
Orville
Terry
Eric
Hubert
Amy
Sal

$1 odnosi si do wartoci pierwszego pola w kadym wierszu wejcia. Poniewa nie specyfikuje
si adnego wzorca, instrukcja drukowania jest stosowana do wszystkich wierszy. W nastpnym
przykadzie wyspecyfikowany jest wzorzec /MA/, ale brakuje procedury. Dziaanie domylne to
drukowanie kadego wiersza, ktry pasuje do wzorca.
$ awk '/MA/' list
John Daggett, 341 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, Boston MA

Drukowane s trzy wiersze. Jak wspomnielimy w pierwszym rozdziale, program awk moe by
uywany troch jak jzyk zapyta, wycigajcy uyteczne informacje z pliku. Mona powiedzie,




  

&'


$

e wzorzec nakada warunek na wybr rekordw, ktre ma zawiera raport, a mianowicie, e powinny zawiera acuch MA. Teraz moemy rwnie wyspecyfikowa, jak cz rekordu ma
zawiera raport. Nastpny przykad stosuje instrukcj print, by ograniczy dane wyjcia do pierwszego pola kadego rekordu:
$ awk '/MA/ { print $1 }' list
John
Eric
Sal

Powysze polecenie atwiej zrozumie, jeli przeczyta si je na gos: drukuj pierwsze sowo kadego wiersza zawierajcego acuch MA. Moemy powiedzie sowo, poniewa domylnie awk
rozdziela wejcie na pola, uywajc znakw spacji lub tabulacji jako ogranicznikw pola.
W nastpnym przykadzie stosujemy opcj -F, by zamieni ogranicznik pola na przecinek. Pozwala to nam wyszuka kade z trzech pl: nazwisko, ulic lub miasto ze stanem:
$ awk -F, '/MA/ { print $1 }' list
John Daggett
Eric Adams
Sal Carpenter

Nie naley myli opcji -F, ktra zmienia ogranicznik pola, z opcj -f, ktra specyfikuje nazw pliku ze skryptem.
W nastpnym przykadzie drukujemy kade pole w osobnym wierszu. Polecenia s rozdzielane
rednikiem:
$ awk -F, '{ print $1; print $2; print $3 }' list
John Daggett
341 King Road
Plymouth MA
Alice Ford
22 East Broadway
Richmond VA
Orville Thomas
11345 Oak Bridge Road
Tulsa OK.
Terry Kalkas
402 Lans Road
Beaver Falls PA
Eric Adams
20 Post Road
Sadbury MA
Hubert Sims
328A Brook Road
Roanoke VA
Amy Vilde
334 Bayshore Pkwy
Mountain View CA
Sal Carpenter
73 6th Street
Boston MA

Przykady z uyciem sed zmieniay tre przychodzcych danych. Przykady z uyciem awk zmieniaj ich uporzdkowanie. Zauwamy, e w powyszym przykadzie pocztkowy odstp uwaany
jest teraz za cz drugiego i trzeciego pola.


  



$





 



Kada z implementacji awk podaje inne komunikaty o bdzie, gdy napotka problemy w napisanym przez nas programie. Nie bdziemy tutaj cytowa komunikatw adnej wersji; bdzie oczywiste, e mamy problem. Komunikaty mog by wywoane przez dowoln z nastpujcych przyczyn:
procedury nie s umieszczone pomidzy nawiasami klamrowymi ({});
instrukcje nie s objte pojedynczymi cudzysowami ('');
wyraenia regularne nie s umieszczone pomidzy prawymi ukonikami (//).

 
Tabela 2.2 podsumowuje opcje wiersza polece awk.
 !"
 "  #
Opcja

Opis

-f

Po niej nazwa pliku ze skryptem.

-F

Zmie separator pola.

-v

Po niej zmienna=warto

Opcja -v, okrelajca parametry w wierszu polece, jest omwiona w rozdziale 7., Pisanie skryptw dla awk.

W systemie UNIX uywa si potoku (ang. pipe), by przekaza wyjcie z jednego programu jako
wejcie do nastpnego. Przyjrzyjmy si kilku przykadom, ktre cz uycie sed i awk przy tworzeniu raportu. Skrypt sed, ktry zastpowa pocztowy skrt stanu jego pen nazw, jest na tyle
oglny, e moe by ponownie uyty jako plik skryptu pod nazw nameState:
$ cat nameState
s/ CA/, California/
s/ MA/, Massachusetts/
s/ OK/, Oklahoma/
s/ PA/, Pennsylvania/
s/ VA/, Virginia/

Oczywicie, warto byoby uwzgldni wszystkie stany, nie tylko pi, a uruchamiajc ten skrypt
z dokumentami innymi ni listy adresowe, upewni si, e nie wykonuje niechcianych podstawie.
Wyjcie tego programu dla wejciowego pliku list ju widzielimy. W nastpnym przykadzie dane wyjcia produkowane przez nameState przekazywane s przez potok do programu awk, ktry
wyciga nazw stanu z kadego rekordu:




  

&'

 



$

$ sed -f nameState list | awk -F, '{ print $4 }'


Massachusetts
Virginia
Oklahoma
Pennsylvania
Massachusetts
Virginia
California
Massachusetts

Program awk przetwarza dane wyjcia wyprodukowane przez skrypt sed. Pamitajmy, e skrypt
sed zastpuje skrt przez przecinek i pen nazw stanu. Tym samym rozdziela trzecie pole, ktre
zawiera miasto i stan, na dwa pola. $4 jest odniesieniem do czwartego pola.
Wszystko, co tu robimy mona by wykona cakowicie w sed, lecz prawdopodobnie z duo mniejsz oglnoci i ze znacznie wikszym trudem. Ponadto, skoro awk pozwala nam zastpi dopasowany acuch znakw, wynik ten moglibymy osign cakowicie za pomoc skryptu awk.
Chocia wynik tego programu nie jest szczeglnie przydatny, mona by go przekaza do sort | uniq -c,
ktry posortowaby stany w postaci alfabetycznej listy z liczb wystpie kadego stanu.
Teraz zrobimy co bardziej interesujcego. Chcemy stworzy raport, ktry sortuje nazwiska ze
wzgldu na stan i wymienia nazw kadego stanu, a po niej nazwisko kadej z osb zamieszkaych w tym stanie. Poniszy przykad przedstawia program byState:
#! /bin/sh
awk -F, '{
print $4 ", " $0
}' $* |
sort |
awk -F, '
$1 == LastState {
print "\t" $2
}
$1 != LastState {
LastState = $1
print $1
print "\t" $2
}'

Ten skrypt shell ma trzy czci. Wywouje awk, aby wytworzy wejcie dla programu sort, a nastpnie wywouje awk ponownie, aby przetestowa posortowane wejcie i stwierdzi, czy w biecym rekordzie nazwa stanu jest identyczna, jak w poprzednim. Obejrzyjmy ten skrypt w akcji:
$ sed -f nameState list | bySate
California
Amy Wilde
Massachusetts
Eric Adams
John Dagett
Sal Carpenter
Oklahoma
Orville Thomas
Pennsylvania
Terry Kalkas
Virginia
Alice Ford
Hubert Sims


  







 

Nazwiska s posortowane ze wzgldu na stan. Jest to typowy przykad uycia awk do tworzenia
raportu z danych, ktre maj struktur.
Aby zobaczy, jak dziaa program byState, przyjrzyjmy si kadej czci oddzielnie. Program jest
przygotowany do czytania wejcia z programu nameState i spodziewa si, e $4 bdzie nazw
stanu. Popatrzmy na dane wyjcia produkowane przez pierwszy wiersz programu:
$ sed -f nameState list | awk -F, '{ print $4 ", " $0 }'
Massachusetts, John Daggett, 341 King Road, Plymouth, Massachusetts
Virginia, Alice Ford, 22 East Broadway, Richmond, Virginia
Oklahoma, Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Pennsylvania, Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Massachusetts, Eric Adams, 20 Post Road, Sudbury, Massachusetts
Virginia, Hubert Sims, 328A Brook Road, Roanoke, Virginia
California, Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Massachusetts, Sal Carpenter, 73 6th Street, Boston, Massachusetts

Program sort domylnie sortuje wiersze w porzdku alfabetycznym, rozpatrujc znaki od lewej do
prawej. W celu posortowania rekordw ze wzgldu na stan, a nie nazwiska, wstawiamy stan na
pocztku rekordu jako klucz sortowania. Teraz program sort moe wykona swoje zadanie. (Zauwamy, e uycie narzdzia sort oszczdza nam pisania w awk programw sortujcych.)
Gdy za drugim razem wywoywany jest awk, wykonujemy zadanie programistyczne. Skrypt
sprawdza pierwsze pole kadego rekordu (stan), aby stwierdzi, czy jest ono identyczne, jak w poprzednim rekordzie. Jeli nie jest identyczne, drukowana jest nazwa stanu, a po niej nazwisko osoby. Jeli jest identyczne, drukowane jest tylko nazwisko.
$1 == LastState {
print "\t" $2
}
$1 != LastState {
LastState = $1
print $1
print "\t" $2
}

Jest tu kilka wanych rzeczy, jak przypisanie do zmiennej, badanie pierwszego pola kadego
z wierszy wejcia, eby zobaczy, czy zawiera zmienny acuch i drukowanie znakw tabulacji
dla wyrwnania wydruku danych. Zauwamy, e przypisanie przed uyciem zmiennej nie jest konieczne (gdy zmienne awk s inicjowane acuchem pustym). To jest niewielki skrypt, ale zobaczymy program podobnego typu, stosowany do porwnywania hase indeksu w znacznie wikszym programie indeksujcym z rozdziau 12., Pene aplikacje. Jednak na razie nie przejmujmy
si zbytnio tym, jak naley rozumie kad z instrukcji. Teraz chodzi nam raczej o to, by pokaza
w oglnych zarysach, do czego mog suy sed i awk.
W tym rozdziale omwilimy podstawowe dziaania sed i awk. Zrobilimy przegld wanych
opcji wiersza polece i zapoznalimy Czytelnika z pisaniem skryptw. W nastpnym rozdziale
przyjrzymy si wyraeniom regularnym, czyli temu, czego uywaj obydwa programy, by dopasowywa wzorce w strumieniu wejciowym.




  

You might also like