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).