File: textutils.1

package info (click to toggle)
manpages-pl 20050320-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 12,200 kB
  • ctags: 16
  • sloc: makefile: 1,454; perl: 477; sh: 316
file content (714 lines) | stat: -rw-r--r-- 26,750 bytes parent folder | download | duplicates (4)
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