1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
|
.\" {PTM/WK/2000-V}
.ig
Transl.note: based on GNU textutils.info
FSF notice for tekstutils docs follows:
Copyright 1994, 95, 96, 1999 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Foundation.
..
.TH TEXTUTILS "1" FSF "sierpie 1999" "Narzdzia tekstowe GNU 2.0"
.SH NAZWA
textutils - opis pakietu narzdzi tekstowych GNU
.SH OD TUMACZA
Podrczniki man dla narzdzi tekstowych GNU nie s ju rozwijane.
Niniejsza strona podrcznika powstaa jako tumaczenie, uywanej
przez twrcw jako podstawowej, dokumentacji formatu info.
W pliku, ktry czytasz umieszczono cz dokumentacji dotyczc wsplnych
cech i opcji programw oraz informacje, ktre z rnych przyczyn nie znalazy
si na stronach opisujcych poszczeglne polecenia pakietu.
Szczegowe opisy samych polece znajdziesz we waciwych, osobnych
stronach podrcznika.
.SH WSTP
Niniejszy podrcznik opisuje zestaw narzdzi tekstowych GNU w wersji 2.0.
Jak i inne podrczniki pakietu, i ten nie jest wyczerpujcy: nie usiowano
wyjani podstawowych poj w sposb odpowiedni dla nowicjuszy. Zatem, jeli
jeste zainteresowany, wcz si, prosz, w udoskonalanie go. Skorzysta
na tym caa wsplnota GNU.
Narzdzia tekstowe GNU s w wikszoci zgodne ze standardem POSIX.2.
Bdy prosz zgasza, w jz.angielskim, do <bug-fileutils@gnu.org>. Pamitaj,
by zamieci numer wersji, architektur maszyny, pliki wejciowe i inne
informacje potrzebne do powielenia bdu: wprowadzane znaki, czego si
spodziewae, co otrzymae i dlaczego jest to le. Pliki diff s mile
widziane, ale prosz doczy rwnie opis problemu, gdy czasem ciko
jest wycign wnioski.
Podrcznik ten powsta pierwotnie na bazie uniksowych stron man napisanych
przez Davida MacKenzie i aktualizowanych przez Jima Meyeringa. Autorytatywn
dokumentacj jest obecnie dokumentacja w formacie info; strony man nie s
ju rozwijane i aktualizowane.
Franc,ois Pinard wykona wstpn konwersj do formatu Texinfo. Karl
Berry wykona indeksy, troch reorganizacji i edycji wynikw.
Richard Stallman wnis swj zwyky nieoceniony wgld w cao procesu.
.SH ZAWARTO PAKIETU
Obecnie pakiet narzdzi tekstowych GNU zawiera dwadziecia kilka programw:
.SS Wypisywanie caoci plikw
.RS 4
.nf
cat czenie i wypisywanie plikw
tac czenie i wypisywanie odwrconych plikw
nl numerowanie linii i wypisywanie plikw
od wypisywanie plikw w formacie semkowym i innych
.fi
.RE
.SS Formatowanie zawartoci plikw
.RS 4
.nf
fmt reformatowanie akapitw tekstu
pr stronicowanie i kolumnowanie plikw do wydruku
fold zawijanie linii wejciowych do zadanej szerokoci
.fi
.RE
.SS Wypisywanie czci plikw
.RS 4
.nf
head wypisywanie pocztku plikw
tail wypisywanie kocwki plikw
split podzia pliku na czci staej wielkoci
csplit podzia pliku na czci zalene od kontekstu
.fi
.RE
.SS Podsumowywanie plikw
.RS 4
.nf
wc wypisywanie liczby bajtw, sw i linii
sum wypisywanie sumy kontrolnej i liczby blokw
csum wypisywanie sumy CRC liczby blokw
md5sum wypisywanie lub sprawdzanie skrtu danych
.fi
.RE
.SS Sortowanie i dziaania na plikach posortowanych
.RS 4
.nf
sort sortowanie plikw tekstowych
uniq pozostawianie unikalnych linii w pliku
comm porwnywanie dwu posortowanych plikw liniami
ptx tworzenie indeksu permutacyjnego zawartoci pliku
tsort sortowanie topologiczne
.fi
.RE
.SS Dziaania na polach wewntrz linii
.RS 4
.nf
cut wypisywanie wybranych czci linii
paste zlepianie linii plikw
join czenie linii wedug wsplnego pola
.fi
.RE
.SS Dziaania na znakach
.RS 4
.nf
tr zamiana, ciskanie, usuwanie znakw
expand zamiana tabulacji na spacje
unexpand zamiana spacji na tabulacje
.fi
.RE
.SH OPCJE WSPLNE
Pewne opcje dostpne s we wszystkich opisywanych programach (naprawd
powinien je przyjmowa kady z programw GNU).
.TP
.B --help
Wywietla informacj o stosowaniu programu i list wszystkich dostpnych opcji,
pomylnie koczy prac.
.TP
.B --version
Wywietla numer wersji programu i pomylnie koczy prac.
.SH Otwarcie skrzynki narzdziowej z programami
.\" Opening the software toolbox
Ten rozdzia pierwotnie pojawi si w 'Linux Journal', volume 1, nr 2,
na kolumnie `What's GNU?'. Zosta napisany przez Arnolda Robbinsa.
.SS Wprowadzenie
W tym miesicu artyku jest tylko ubocznie zwizany z Projektem GNU,
gdy opisuje kilka narzdzi GNU obecnych w systemie Linux i sposoby,
na jakie moesz z nich korzysta. Faktycznie artyku jest o filozofii
"Narzdzi programowych" w rozwijaniu i wykorzystywaniu programw.
Filozofia narzdzi programowych bya wanym i integralnym pojciem
w pocztkowym projekcie i rozwoju Uniksa (ktrego Linux i GNU s zasadniczo
klonami). Niestety, przy wspczesnym nacisku intersieci i byskotliwych GUI,
wydaje si, e idea ta spada na pobocze. To wstyd, poniewa zapewnia ona
potny model mylowy do rozwizywania wielu rodzajw problemw.
Sporo ludzi nosi w kieszeniach spodni szwajcarski scyzoryk. Scyzoryk jest
wygodnym narzdziem: ma kilka ostrzy, rubokrt, pincet, wykaaczk, zestaw
gwodzi, korkocig i moe kilka innych rzeczy. Do codziennych drobnych,
rnorodnych zada, gdzie potrzebujesz prostego narzdzia oglnego
zastosowania, jest wanie tym, o co chodzi.
Z drugiej strony, dowiadczony ciela nie buduje domu scyzorykiem.
Zamiast tego ma skrzynk wypchan specjalizowanymi narzdziami -- jest tam
pia, motek, rubokrt, strug i tak dalej. I dokadnie wie kiedy i gdzie
uy kadego z narzdzi. Nie przyapaby go na wbijaniu gwodzi rkojeci
rubokrtu.
Konstruktorzy Uniksa w Bell Labs byli cakiem zawodowymi programistami
i wyszkolonymi naukowcami komputerowymi. Zauwayli, e cho rozwizanie
wszystko-w-jednym moe przyciga uytkownika, gdy ma on tylko jeden program
do korzystania, w praktyce programy takie s
a. trudne do napisania,
b. trudne w konserwacji i usuwaniu bdw, oraz
c. trudne do rozbudowy, przystosowania do nowych sytuacji.
Uwaali, e zamiast tego, programy powinny by specjalizowanymi narzdziami.
Krtko mwic, kady program "powinien robi jedn rzecz dobrze". Nie wicej
i nie mniej. Takie programy s atwiejsze do zaprojektowania, napisania
i zrozumienia -- robi tylko jedn rzecz.
Ponadto zauwayli, e przy odpowiednim mechanizmie czenia programw
cao jest wiksza od sumy skadowych. Wic kilka specjalizowanych programw
moesz zrealizowa konkretne zadanie, do ktrego aden z nich nie by
projektowany i osign to duo szybciej i atwiej ni piszc dla niego
specjalizowany program. W dalszej czci artykuu zobaczymy kilka (klasycznych)
tego przykadw. Wanym dodatkowym punktem byo to, e jeli jest to niezbdne,
naley najpierw zrobi narzdzia, ktre bd potrzebne, jeeli nie ma si
jeszcze odpowiednich w skrzynce narzdziowej.
.SS Przekierowanie wejcia/wyjcia
Mam nadziej, e jeste obeznany z podstawami przekierowywania wejcia/wyjcia
w powoce, w szczeglnoci z pojciami "standardowego wejcia", "standardowego
wyjcia" i "standardowego wyjcia bdw (diagnostycznego)". Zwile:
"standardowe wejcie" jest rdem danych, skd pochodz dane. Program nie musi
wiedzie ani dba o to, czy rdem danych jest plik dyskowy, klawiatura,
tama magnetyczna czy nawet czytnik kart perforowanych. Podobnie, "standardowe
wyjcie" jest odpywem danych, dokd dane spywaj. Program nie powinien ani
wiedzie ani dba o to, gdzie to moe by. Programy, ktre tylko czytaj swoje
standardowe wejcie, robi co z tymi danymi i wysyaj je na standardowe
wyjcie, nazywane s "filtrami", przez analogi do filtrw w wodocigach.
W powoce uniksowej bardzo atwo jest zestawi potoki danych:
[tum.: ang.'pipeline' to 'rurocig' lub, w informatyce, 'potok']
.nf
program_tworzacy_dane | filtr1 | .... | filtrN > koncowe.dane
.fi
Zaczynamy od utworzenia surowych danych pierwotnych. Kady z filtrw stosuje
pewne kolejne przeksztacenie danych, a wychodzc z potoku bd one mie
podan posta.
To jest eleganckie i dobre dla standardowego wejcia i standardowego wyjcia.
A gdzie si tu pojawia standardowe wyjcie bdw? C, pomylmy o 'filtr1'
w powyszym potoku. Co si stanie, jeli napotka on bd w przyjmowanych
danych? Jeeli wypisze komunikat o bdzie na standardowe wyjcie, to po prostu
zniknie on w potoku wejcia do 'filtr2' a uytkownik zapewne nigdy go
nie zobaczy. Zatem programici potrzebuj miejsca, gdzie mogliby wysya
komunikaty o bdach, tak by uytkownik je zauway. Jest to standardowe
wyjcie diagnostyczne i zwykle zwizane jest z twoj konsol lub oknem,
nawet jeli przekierowae standardowe wyjcie programu gdzie poza ekran.
Aby programy filtrujce mogy wspdziaa, musi zosta uzgodniony format
danych. Najprostszym i najatwiejszym w wykorzystaniu formatem s zwyke
wiersze tekstu. Uniksowe pliki danych s zazwyczaj po prostu strumieniami
bajtw, o wierszach zakoczonych znakiem LF ASCII (Line Feed - wysuw linii),
konwencjonalnie w literaturze dotyczcej Uniksa nazywanym "znakiem nowej linii"
(newline). (Jest to '\\n' jeli programujesz w C.) To format stosowany przez
wszystkie tradycyjne programy filtrujce. (Wiele wczeniejszych systemw
operacyjnych wypracowao rodki i specjalizowane programy do obsugi danych
binarnych. Unix zawsze wystrzega si takich rzeczy, zgodnie z filozofi,
e najatwiej jest mc przeglda i modyfikowa dane po prostu edytorem
tekstu.)
Dobrze, starczy wprowadzenia. Przyjrzyjmy si niektrym narzdziom,
a wtedy zobaczymy jak wiza je ze sob na ciekawe sposoby. W dalszych
rozwaaniach pokaemy tylko te opcje wiersza polece, ktre nas interesuj.
Tak jak zawsze powiniene, dwukrotnie sprawd dokumentacj systemow.
Znajdziesz tam pene opisy.
.SS Polecenie 'who'
Pierwszym programem jest polecenie 'who'. Samodzielne, tworzy list aktualnie
zalogowanych uytkownikw. Mimo, e pisz to w systemie jednouytkownikowym,
bdziemy udawa, e zalogowanych jest kilka osb:
.nf
$ who
arnold console Jan 22 19:57
miriam ttyp0 Jan 23 14:19(:0.0)
bill ttyp1 Jan 21 09:32(:0.0)
arnold ttyp2 Jan 23 20:48(:0.0)
.fi
Znak '$' jest tu zwyczajow zacht powoki, po ktrej napisaem 'who'.
Zalogowane s trzy osoby, w tym ja dwukrotnie. W tradycyjnych systemach Unix
nazwy uytkownikw nigdy nie maj wicej ni osiem znakw. Ta maa ciekawostka
przyda si pniej. Wyjcie z 'who' wyglda adnie, ale dane nie s a tak
pasjonujce.
.SS Polecenie 'cut'
Nastpnym programem, ktremu si przygldniemy jest polecenie 'cut' (wytnij).
Wycina ono kolumny lub pola z danych wejciowych. Na przykad, moemy nakaza
mu wypisanie tylko nazwy zgoszeniowej i nazwiska z pliku /etc/passwd.
Plik posiada siedem pl, rozdzielonych dwukropkami:
.nf
arnold:xyzzy:2076:10:Arnold D. Robbins:/home/arnold:/bin/ksh
.fi
Do pobrania pierwszego i pitego pola, uylibymy takiego wycinania:
.nf
$ cut -d: -f1,5 /etc/passwd
root:Operator
...
arnold:Arnold D. Robbins
miriam:Miriam A. Robbins
...
.fi
Z opcj '-c', 'cut' wycina konkretne znaki (tj. kolumny) wierszy wejciowych.
To polecenie wyglda na przydatne do filtrowania danych.
.SS Polecenie 'sort'
Nastpnie przyjrzymy si 'sort'. To jedno z najpotniejszych
polece w systemie typu uniksowego. Czsto bdziesz go uywa przy
konstruowaniu rnych wymylnych rurocigw. 'sort' czyta i sortuje kady
z podanych w wierszu polece plikw. Nastpnie scala uporzdkowane dane
i wypisuje na standardowe wyjcie. Jeli w wierszu polece nie poda si
adnych nazw plikw to czyta standardowe wejcie (w ten sposb robimy ze
filtr). Sortowanie oparte jest na leksykograficznym porzdku znakw lub
kryteriach porzdkowania zadanych przez uytkownika.
.SS Polecenie `uniq'
Na koniec (przynajmniej na razie), przygldniemy si programowi 'uniq'.
Przy sortowaniu danych czsto uzyskasz powtrzone wiersze, wiersze,
ktre s identyczne. Zazwyczaj potrzebujesz tylko jednego wystpienia kadego
z nich. Tu wanie pojawia si 'uniq'. Czyta on ze swego standardowego wejcia,
spodziewajc si, e jest ono posortowane. Wypisuje tylko jeden egzemplarz
kadego zduplikowanego wiersza. 'uniq' ma kilka opcji. W dalszym cigu
wykorzystamy opcj '-c', wypisujc przed niepowtarzalnym wierszem
ile razy wystpi on w danych wejciowych.
.SS czenie narzdzi
Zamy teraz, e mamy system BBS z zalogowanymi dziesitkami
uytkownikw. Zarzdzajcy chc, by operator systemu (SysOp) napisa
program tworzcy posortowan list zalogowanych uytkownikw.
Co wicej, nawet jeli uytkownik jest zalogowany wielokrotnie, jego nazwa
powinna w wyniku pojawi si tylko raz.
SysOp mgby si z dokumentacj systemow i napisa program w C, ktry
by to robi. Kosztowaoby to pewnie kilkaset linii kodu i okoo dwu godzin
pisania, testowania i usuwania bdw. Jednak, znajc narzdzia programowe,
SysOp moe zamiast tego zacz od utworzenia tylko listy zalogowanych
uytkownikw:
.nf
$ who | cut -c1-8
arnold
miriam
bill
arnold
.fi
Nastpnie, posortowa list:
.nf
$ who | cut -c1-8 | sort
arnold
arnold
bill
miriam
.fi
Na koniec, przepuci posortowan list przez 'uniq', by wypieli duplikaty:
.nf
$ who | cut -c1-8 | sort | uniq
arnold
bill
miriam
.fi
Polecenie 'sort' faktycznie posiada opcj '-u', ktra robi to, co 'uniq'.
Jednak 'uniq' ma inne zastosowania, w ktrych nie mona go zastpi
przez 'sort -u'.
SysOp umieszcza ten potok w skrypcie powoki i udostpnia go wszystkim
uytkownikom systemu:
.nf
# cat > /usr/local/bin/listusers
who | cut -c1-8 | sort | uniq
^D
# chmod +x /usr/local/bin/listusers
.fi
Warto tu zauway cztery zalety. Po pierwsze, przy pomocy zaledwie
czterech programw, w jednej linii polece, SysOp mg oszczdzi okoo
dwu godzin pracy. Co wicej, potok powoki jest prawie tak samo wydajny,
jak byby program w C, a o wiele bardziej efektywny jeli chodzi o czas
programisty. Czas ludzki jest o wiele kosztowniejszy ni czas komputera,
a w naszym wspczesnym spoeczestwie, gdzie "nigdy nie ma do czasu by
wszystko zrobi", zaoszczdzenie dwu godzin czasu programisty jest
nie byle jakim wyczynem.
Po drugie, rwnie istotne jest podkrelenie, e przy pomocy _poczenia_
narzdzi moliwe jest wykonanie specyficznego zadania, nigdy
nie przewidywanego przez autorw pojedynczych programw.
Po trzecie, wartociowe jest te stopniowe budowanie potoku, jak to
zrobilimy. Pozwala ono na przygldnicie si danym na kadym etapie
przebiegu potoku, co pomaga uzyska pewno, e rzeczywicie poprawnie
uywasz narzdzi.
Na koniec, dziki zapakowaniu potoku w skrypt powoki, inni uytkownicy mog
korzysta z twojego polecenia, nie muszc pamita o zawartoci tego
wymylnego opakowania. Z punktu widzenia sposobu uruchamiania, skrypty powoki
i skompilowane programy s nierozrnialne.
Po uprzedniej rozgrzewce, przypatrzymy si dwu kolejnym, bardziej
skomplikowanym potokom.
Potrzebujemy dla nich wprowadzi jeszcze dwa narzdzia.
Pierwszym jest polecenie 'tr', oznaczajce "transliteracj".
Polecenie 'tr' wymienia znaki, dziaajc na zasadzie znak-na-znak.
Zwykle stosowane jest do takich rzeczy jak odwzorowanie duych liter
na mae.
.nf
$ echo ThIs ExAmPlE HaS MIXED case! | tr '[A-Z]' '[a-z]'
this example has mixed case!
.fi
Interesuje nas kilka opcji:
.TP
\-c
dziaa na dopenieniu wskazanych znakw, tj. dziaania odnosz si
do znakw spoza zadanego zestawu
.TP
\-d
usuwa z wyniku znaki okrelone w pierwszym zestawie
.TP
\-s
ciska w wyniku powtrzone znaki w pojedynczy znak.
.PP
Za chwil bdziemy korzysta ze wszystkich trzech opcji.
Innym poleceniem, ktremu si przyjrzymy jest 'comm'. Pobiera ono dwa
posortowane pliki jako dane wejciowe i wypisuje ich wiersze w trzech
kolumnach. Kolumny wynikowe s unikalnymi wierszami z pierwszego pliku,
unikalnymi wierszami z drugiego pliku i wierszami danych wsplnymi dla obu.
Opcje '1', '-2' i '3' pomijaj odpowiednie kolumny. Nie jest to intuicyjne
i wymaga pewnego przywyknicia. Na przykad:
.nf
$ cat f1
11111
22222
33333
44444
$ cat f2
00000
22222
33333
55555
$ comm f1 f2
00000
11111
22222
33333
44444
55555
.fi
Pojedyncza kreska jako nazwa pliku nakazuje 'comm' czytanie standardowego
wejcia zamiast zwykego pliku.
Jestemy teraz gotowi do skonstruowania wymylnego potoku.
Pierwszym zastosowaniem jest licznik czstoci sw. Pomaga autorowi
stwierdzi, czy nie naduywa on pewnych sw.
Pierwszym krokiem jest zmiana wielkoci wszystkich liter z pliku wejciowego
na jedn wielko. "to" i "To" przy zliczaniu s tym samym sowem.
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | ...
.fi
[tum.: zauwa, e dla jzyka polskiego, podobnie jak w nastpnym kroku,
naley uwzgldni dodatkowo nasze znaki diakrytyczne. Mona doczy je
do podanego zakresu lub, lepiej, posuy si klas znakw i ustawieniami
narodowymi - zobacz \fBtr\fP(1).]
.br
Nastpnym krokiem jest pozbycie si znakw przestankowych. Sowa cytowane
i niecytowane powinny by traktowane identycznie; najatwiej bdzie po prostu
wyrzuci zawadzajc interpunkcj.
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' | ...
.fi
Drugie polecenie 'tr' dziaa na dopenieniu podanych znakw, ktrymi s
litery, cyfry, podkrelenie i odstp. '\012' oznacza znak nowej linii,
naley go pozostawi. Dla dobrego pomiaru w dziaajcym skrypcie
powinien by te zawarty znak tabulacji (ASCII tab).
Na tym etapie, mamy dane skadajce si ze sw rozdzielonych odstpami.
Sowa zawieraj wycznie znaki alfanumeryczne i znak podkrelenia.
Nastpnym krokiem jest rozbicie danych na czci tak, bymy mieli po jednym
sowie w wierszu. Jak wkrtce zobaczymy, znacznie uatwia to zliczanie.
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' |
> tr -s '[ ]' '\012' | ...
.fi
To polecenie zamienia odstpy w znaki nowej linii. Opcja '-s' ciska
wielokrotne znaki nowej linii wyniku w pojedynczy. Pomaga nam to unikn
pustych wierszy. (Znak '>' jest tu wtrnym znakiem zachty powoki. Powoka
wypisuje go, gdy zauway, e nie zakoczye wpisywania caego polecenia.)
Teraz mamy dane skadajce si z jednego sowa w kadym wierszu, bez znakw
interpunkcyjnych, wszystkie pisane jedn wielkoci.
Jestemy gotowi do zliczania kadego z nich:
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' |
> tr -s '[ ]' '\012' | sort | uniq -c | ...
.fi
Na tym etapie, dane mog wyglda jako tak:
.nf
60 a
2 able
6 about
1 above
2 accomplish
1 acquire
1 actually
2 additional
.fi
Wynik jest posortowany wedug sw, nie wedug liczby wystpie!
Chcielibymy natomiast mie jako pierwsze najczciej uywane sowa.
Na szczcie, atwo to osign przy pomocy dwu dodatkowych opcji 'sort':
.TP
\-n
wykonuje sortowanie liczbowe, a nie tekstowe
.TP
\-r
odwraca kolejno sortowania
.PP
Ostateczny potok wyglda tak:
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' |
> tr -s '[ ]' '\012' | sort | uniq -c | sort -nr
156 the
60 a
58 to
51 of
51 and
...
.fi
No, no! Sporo do opowiadania. Nadal jednak obowizuj te same zasady.
Przy pomocy szeciu polece, w dwu wierszach (faktycznie jednej dugiej linii
podzielonej dla wygody), stworzylimy program, ktry robi co ciekawego
i poytecznego, w duo krtszym czasie ni moglibymy napisa program w C
robicy to samo.
Niewielkie zmiany w powyszym potoku mog nam da prosty korektor pisowni!
Do stwierdzenia, czy napisae poprawnie jakie sowo wystarczy, e
poszukasz go w sowniku. Jeli w nim nie wystpuje, to moliwe, e twoja
pisownia jest nieprawidowa. Tak wic, potrzebujemy sownika. Jeeli masz
dystrybucj Slackware Linux, to plik '/usr/lib/ispell/ispell.words' jest
posortowanym, zawierajcym 38.400 sw, sownikiem.
Zatem, jak porwna nasz plik ze sownikiem? Jak poprzednio, utworzymy
posortowan list sw, po jednym w wierszu:
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' |
> tr -s '[ ]' '\012' | sort -u | ...
.fi
Teraz potrzebujemy tylko listy sw, ktrych NIE MA w sowniku.
Tu wanie pojawia si polecenie 'comm'.
.nf
$ tr '[A-Z]' '[a-z]' < whats.gnu | tr -cd '[A-Za-z0-9_ \012]' |
> tr -s '[ ]' '\012' | sort -u |
> comm -23 - /usr/lib/ispell/ispell.words
.fi
Opcje '-2' i '-3' likwiduj wiersze wystpujce tylko sowniku (drugi plik),
i wystpujce w obu plikach. Wiersze obecne tylko w pierwszym pliku
(standardowe wejcie, nasz strumie sw), s sowami, ktrych nie ma
w sowniku. S to prawdopodobne bdy pisowni.
Taki potok by pierwszym etapem budowy korektora pisowni w Uniksie.
Istnieje jeszcze kilka innych narzdzi wymagajcych krtkiej wzmianki.
.TP
grep
szuka w plikach tekstu pasujcego do wyraenia regularnego
.TP
egrep
jak 'grep', ale z bardziej rozbudowanymi wyraeniami regularnymi
.TP
wc
zlicza wiersze, sowa, znaki
.TP
tee
kopiuje dane do plikw i na standardowe wyjcie;
dziaa jak T-ksztatka w rurocigu danych
.TP
sed
edytor strumieniowy, zaawansowane narzdzie
.TP
awk
jzyk manipulacji danymi, kolejne zaawansowane narzdzie
.PP
Filozofia narzdzi programowych daje te nastpujc rad: "Niech kto
inny zrobi trudn cz pracy".
To znaczy, we co, co zaspokoi wikszo twoich potrzeb, a nastpnie
przeksztacaj dalej, a uzyskasz podan posta.
Podsumowujc:
.IP 1.
Kady program powinien robi jedn rzecz, ale dobrze. Nie wicej, nie mniej.
.IP 2.
czenie programw w odpowiedni sposb prowadzi do rezultatu, gdzie
cao jest wiksza od sumy czci. Prowadzi te do nowatorskich
zastosowa programw, ktrych ich autorzy nawet sobie nie wyobraali.
.IP 3.
Programy nigdy nie powinny wypisywa dodatkowych danych nagwkowych
czy koczcych, gdy mogyby one zosta przesane potokiem.
(Cecha, o ktrej wczeniej nie wspominalimy).
.IP 4.
Niech kto inny wykona trudn cz roboty.
.IP 5.
Znaj swoje narzdzia! Kadego programu uywaj we waciwy sposb.
Jeeli nie masz odpowiedniego narzdzia - zrb je.
.PP
W chwili powstania tego artykuu, wszystkie omawiane programy byy dostpne
przez anonimowe ftp z \fBprep.ai.mit.edu\fP jako
\fI/pub/gnu/textutils-1.9.tar.gz\fP.
Wersja 1.9 bya wwczas biec. Sprawd w najbliszym archiwum GNU jaka
wersja jest aktualnie bieca.
Gwn siedzib archiwum jest obecnie \fBftp.gnu.org\fP.
Nic z tego, co przedstawiem w tym artykule nie jest nowe. Filozofia Narzdzi
Programowych zostaa po raz pierwszy wprowadzona w ksice 'Software Tools',
Briana Kernighana i P.J. Plaugera (Addison-Wesley, ISBN 0-201-03669-X).
Ksika ta pokazywaa jak pisa i wykorzystywa narzdzia programowe.
Zostaa napisana w 1976, korzystajc z preprocesora FORTRAN-u o nazwie 'ratfor'
(RATional FORtran). Wwczas C nie by tak wszechobecny jak dzi. FORTRAN by.
Ostatni rozdzia przedstawia 'ratfor' dla procesora FORTRAN-u, napisany w
'ratforze'. 'ratfor' wyglda bardzo podobnie do C -- jeli znasz C,
nie bdziesz mie adnych kopotw ze zrozumieniem kodu.
W 1981 ksika ta zostaa zaktualizowana i udostpniona jako 'Software Tools
in Pascal' (Addison-Wesley, ISBN 0-201-10342-7). Obie ksiki s nadal
drukowane i s rzeczywicie warte przeczytania jeli jeste programist.
Z pewnoci bardzo zmieniy mj punkt widzenia na programowanie.
Pocztkowo programy z obu ksiek byy dostpne (na 9-calowej tamie)
z Addison-Wesley. Niestety, ju tak nie jest, mimo e moesz znale kopie
rozproszone w Internecie. Przez wiele lat dziaaa Software Tools Users Group
\- Grupa Uytkownikw Narzdzi Programowych, ktrej czonkowie przenieli
pierwotne programy 'ratforu' na niemal kady system komputerowy z kompilatorem
FORTRAN-u. Popularno grupy zanika w poowie lat 80-tych, gdy Unix zacz
rozpowszechnia si poza uniwersytetami.
Przy obecnym rozmnoeniu kodu GNU i innych klonw programw uniksowych,
programom tym powica si teraz niewiele uwagi. Wspczesne wersje C
s o wiele wydajniejsze i robi wicej ni te programy. Niemniej jednak,
ksiki te s niezrwnane jako opis dobrego stylu programowania, goszc
wci cenn filozofi. Gorco je polecam.
Podzikowania: chciabym wyrazi sw wdziczno Brianowi Kernighanowi
z Bell Labs, pierwszemu Kowalowi Narzdzi Programowych, za przejrzenie tego
artykuu.
.SH ZOBACZ TAKE
.TP 12
.BR cat (1)
czenie i wypisywanie plikw
.TP 12
.BR comm (1)
porwnywanie dwu posortowanych plikw liniami
.TP 12
.BR csplit (1)
podzia pliku na czci zalene od kontekstu
.TP 12
.BR csum (1)
wypisywanie sumy CRC liczby blokw
.TP 12
.BR cut (1)
wypisywanie wybranych czci linii
.TP 12
.BR expand (1)
zamiana tabulacji na spacje
.TP 12
.BR fmt (1)
reformatowanie akapitw tekstu
.TP 12
.BR fold (1)
zawijanie linii wejciowych do zadanej szerokoci
.TP 12
.BR head (1)
wypisywanie pocztku plikw
.TP 12
.BR join (1)
czenie linii wedug wsplnego pola
.TP 12
.BR md5sum (1)
wypisywanie lub sprawdzanie skrtu danych
.TP 12
.BR nl (1)
numerowanie linii i wypisywanie plikw
.TP 12
.BR od (1)
wypisywanie plikw w formacie semkowym i innych
.TP 12
.BR paste (1)
zlepianie linii plikw
.TP 12
.BR pr (1)
stronicowanie i kolumnowanie plikw do wydruku
.TP 12
.BR ptx (1)
tworzenie indeksu permutacyjnego zawartoci pliku
.TP 12
.BR sort (1)
sortowanie plikw tekstowych
.TP 12
.BR split (1)
podzia pliku na czci staej wielkoci
.TP 12
.BR sum (1)
wypisywanie sumy kontrolnej i liczby blokw
.TP 12
.BR tac (1)
czenie i wypisywanie odwrconych plikw
.TP 12
.BR tail (1)
wypisywanie kocwki plikw
.TP 12
.BR tr (1)
zamiana, ciskanie, usuwanie znakw
.TP 12
.BR tsort (1)
sortowanie topologiczne
.TP 12
.BR unexpand (1)
zamiana spacji na tabulacje
.TP 12
.BR uniq (1)
pozostawianie unikalnych linii w pliku
.TP 12
.BR wc (1)
wypisywanie liczby bajtw, sw i linii
.PP
|