Obróbka tekstu

Czy zdarzyło ci się mieć duuuuużo plików tekstowych, w których chciałeś zrobić parę drobnych zmian? Pod linuksem jest to dość często spotykane. A jeszcze częściej przydałoby się conieco przefiltrować wyjście jakiegoś programu (na przykład ps -Af). Zaczniemy od filtrowania.
Najważniejszym narzędziem pod systemami un*xowymi jest grep. Tego narzędzia nie da się zastąpić po prostu niczym. grep filtruje to, co dostanie na standardowe wejście i wypisuje na standardowym wyjściu te linie, które zawierają podany wyraz. Spróbuj vim --version. Dostaniesz multum informacji, a ty chcesz (powiedzmy) znaleźć tylko info o vimrc. Teraz spróbuj przepuścić to przez grep vimrc jak następuje: vim --version | grep vimrc. To już się czyta nieco lepiej, nie?
To jest najbardziej łopatologiczne zastosowanie grepa. Z bardziej zaawansowanych mogę podać wyszukiwanie słowa w pliku/plikach: grep fat /etc/fstab. To wyszukuje słówka fat w pliku /etc/fstab (drobna dygresja: grep oczekuje na pierwszym miejscu opcji poszukiwań [lub ich braku], za nimi wyrażenia, którego będzie szukał [jeden parametr! w razie spacji ogranicz go w cudzysłów], a resztę potraktuje jak nazwy plików [*]). To teraz pora na parę użytecznych opcji:

A cooo toooo sąąąą wyrażeniaaa regulaaarneeee? Takie coś już objaśniałem w kąciku Vim-a i tutaj. Być może będziesz musiał wyeskejpować (czyli poprzedzić backslashem) inne literki, żeby uzyskać dokładnie to, o co ci chodzi, ale ogólna idea jest ta sama. A, i jeszcze jedno. Powiem o tym dokładniej za parę lekcji, ale bash również używa wyrażeń regularnych (na przykład gwiazdka). Żeby nie interpretował twoich literek ujmij całe wyrażenie w cudzysłów pojedynczy [pod cudzysłowiem podwójnym] (nazwijmy to tak roboczo; to nie jest ani apostrof, ani cudzysłów, ale tak trudno to nazwać, że to określenie jest wystarczająco dobre).
grep już był, pora na parę innych użytecznych programów. head wypisuje 10 pierwszych linii pliku lub standardowego wejścia gdy nie podałeś pliku. Można to zmienić: head -n ## lub head -## wypisze ## linii (haszcze zamieniasz na ilość linii). Gdy podałeś kilka plików, opcja -q powoduje, że head nie wypisuje, co to za plik.
Symetrycznie zachowuje się tail (wypisuje ostatnie linie), z tym że może wypisać linie od piątej do końca pliku przy użyciu opcji +5 zamiast -5 (tzn. tail +23 nazwa-pliku wypisze plik nazwa-pliku od linii 23 do końca).
Jeśli chcesz wyciąć, powiedzmy, pierwsze pięć znaków z każdej linii pliku, to tu się świetnie nadaje programik cut. Do naszych celów wystarczy komenda cut -c 1-5 nazwa-pliku, która wypisze te znaki na ekran. Składnia (jak z tego widać) jest następująca: cut -c lista-znaków plik. Lista znaków to zbiór liczb (np. 15) lub zakresów (np. 20-35) pooddzielanych przecinkami. Przykładowa lista -3,5,7-15,20-33,50- oznacza "wszystko do 3, potem 5, potem 7-15, 20-33, a na koniec 50 i wszystko dalej". A zamiast -c możesz wpisać -f, wtedy wycinasz nie znaki, a całe pola, gdzie pola są pooddzielane tabulacjami (pole 1 to wszystko do pierwszej tabulacji, drugie - do drugiej itd.). Możesz zapodać, co cut ma traktować zamiast tab-a jako oddzielacz: -d ' '. A jak nie podasz nazwy pliku, który cut miałby ciąć, to domyślnie tnie standardowe wejście (echo "Test wycinania 1 2 3 4 5 6" | cut -f 1,3-5 -d ' ' da wynik Test 1 2 3).
Czasem ważniejsze od tego, co jest na wejściu czy w pliku jest to, ile tam zostało użytych słów czy linii. Do tego służy wc (ang. word counter, nie water closet :) ). Domyślnie liczy ilość znaków, słów i linii. Przy podaniu opcji -c liczy tylko znaki, -w - słowa, -l - linie. Przy dowolnej kombinacji tych parametrów wc policzy i wyświetli to, co kazałeś. W szczególności kombinacja -w -l -c powoduje wypisanie wszystkich informacji.
Został chyba tylko sed. Składnia: sed 'komendy' pliki.... Najczęściej stosuje się sed 's/cos1/cos2/g', gdzie cos1 to wrażenie regularne, a cos2 to to, na co zamieniamy. Składnia w zasadzie podobna do Vim-owej. Drugą często stosowaną komendą seda jest sed 't/abcdef/ABCDEF/g'. Ta podstawia zamiast małych liter a-f duże litery A-F. W obu przypadkach sed czyta dane, na których będzie operować ze standardowego wejścia.
To by chyba było tyle o obróbce tekstu. Poczytaj jeszcze o wyrażeniach regularnych, mogą ci się przydać znacznie częściej, niż myślisz.


[*] Nie do końca prawda. Opcje w GNU grepie mogą być wymieszane z nazwami plików. Jednak żelazną zasadą jest to, że wyrażenie szukane jest przed wszystkimi nazwami plików (pod Solarisem opcje muszą wystąpić przed wyrażeniem).


Dalsza część kursu
Poprzednia część kursu
Jadłospis