Napisane przez mediologia dnia . Wysłane Rozdział 4 - Filtry w Linuksie.

4.2 Panorama filtrów Linux

Zapoznamy się teraz z funkcjonowaniem podstawowych filtrów używanych w systemie Linux:

cat wyświetla zawartość pliku

tail wyświetla koniec pliku

head wyświetla początek pliku

nl numeruje wiersze pliku

more wyświetlanie pliku strona po stronie

wc liczy linie, słowa, i znaki

sort uporządkowanie, fuzja plików

grep poszukiwanie ciągu znaków w pliku

tr prosta modyfikacja pliku

 

Polecenie   cat

Polecenie cat umożliwia wyświetlenie pliku a następnie zapisanie wyświetlonej zawartości – przy pomocy mechanizmu przekierowania – wybranego pliku w innym pliku.

Opcja Funkcja:

-b wyświetla numeracje wszystkich niepustych wierszy pliku

-E wyświetla znak  $ na końcu każdego wiersza

-T wyświetla znaki tabulacji  jako ^I

-v wyświetla znaki niedrukowalne poza znakami tabulacji i znaku

-n numeruje wszystkie wiersze

 

Polecenie head

Użycie polecenia head wyświetla nagłówek pliku. Często zdarza się, że plik, który użytkownik chce poddać edycji jest bardzo duży – zawiera kilkaset a nawet kilka tysięcy linii. Natomiast informacje których szuka użytkownik znajdują się w pierwszych liniach tekstu zawartego w pliku. Polecenie  head można przedstawić następująco:

head  -opcja  nazwa pliku

 

Opcje Funkcje:

-c wyświetla pierwsze N bajtów pliku

-n wyświetla N pierwszych wierszy

-c N{a,b,c} wyświetla pierwsze N blokow, odpowiednio 512 B, 1kB, 1Mb

Przećwiczmy zastosowanie polecenia head. W tym celu skorzystamy z dobrze znanego użytkownikowi  pliku  /etc/passwd oraz z konstrukcji potoku która szerzej omówimy w rozdziałach następnych:

 

Polecenie  tail

Jeżeli chcemy wyświetlić na ekranie końcowa zawartość pliku, powinniśmy skorzystać z dostępnego i stworzonego w tym celu polecenia tail. Poniżej znajduje się jego składnia i dostępne opcje.

tail     -opcja    nazwa pliku

 

Opcja Funkcja:

-c wyświetla ostatnie N bajtów

-f nadzoruje wzrost pliku

-n wyświetla N ostatnich wierszy

 

Polecenie  nl

Polecenie nl numeruje wiesze pliku. Załóżmy, że dysponujemy następującym plikiem poemat. Wyświetlimy go na ekranie przy pomocy polecenia cat

 

$ cat  poemat

 

Opadają kwasem wina

Liscie dębu i czeresni

I zza wody psi przylesni

Szczekaja jak mandolina

 

Bałałajke psiej tęsknoty

Uwiązali na łancuchu

Za to zdzierze-mgle na uchu

Dynda miesiac – kolczyk złoty

 

 

$ nl poemat #numeruje linie poematu

 

1 Opadają kwasem wina

2 Liście dębu i czereśni

3 I zza wody psi przyleśni

4 Szczekaja jak mandolina

 

5 Bałałajke psiej tęsknoty

6 Uwiązali na łańcuchu

7 Za to ździerze-mgle na uchu

8 Dynda miesiąc – kolczyk złoty

 

 

$ tail -3  poemat #wyświetla 3 ostatnie linie wiersza „poemat”

 

Uwiązali na łancuchu

Za to zdzierze-mgle na uchu

Dynda miesicc – kolczyk złoty

 

 

$ tail  +2  poemat #wyświetla od 2 lini do końca

 

Za to zdzierze-mgle na uchu

Dynda miesiac – kolczyk złoty

 

 

$ head -3 poemat #wyświetla 3 pierwsze linie

 

Opadaja kwasem wina

Liście debu i czeresni

I zza wody psi przylesni

 

Uwagi: Liczba liń branych pod uwagę przez polecenie tail i head wynosi 10

 

Co się dzieje gdy wystukamy (polecenie będące filtrem) bez żadnego argumentu, czyli bez nazwy pliku np.

$ wc[Enter] *

Polecenia zwane filtrami oczekują, że wprowadzimy jakieś dane możemy to zrobić i aby powrócić do lini poleceń i przerwać zapełnianie ekranu musimy wystukać jednocześnie  [ Carl ]+D

 

Polecenie  more

Często zdarza się, że edytowany przez użytkownika plik lub rezultat polecenia n.p ls –R / jest bardzo dużych rozmiarów i gdy jest wyświetlany na ekranie jego zawartość przelatuje przed oczyma użytkownika i widoczna jest jego końcowa część. Polecenie   more  umożliwia zapobiegać takim sytuacjom wyświetlając plik fragmentami ; przejście do następnego fragmentu następuje po naciśnięciu klawisza  spacja. Ogólna postać polecenia wygląda następująco:

more  [  opcja  ]  [ liczba wierszy ]  [ nazwa  pliku]

 

Opcja Funkcja

-d wyświetla komunikat: Press space to continue q to quit na końcu każdego wyświetlanego wiersza

-f zlicza długie wiersze zapisane w kilku wierszach jako jeden wiersz

-l ignoruje znak zmiany strony

-q zatrzymuje wykonywanie polecenia more

-p blokuje przewijanie ekranu

-s zbiera wszystkie puste wiersze występujące po koleji w jeden pusty wiersz

-u blokuje podkreślenia

-liczba wierszy liczba wierszy która ma zostać jednorazowo

+numer wiersza rozpoczyna wyświetlenie zawartości pliku od wiersza numer pliku

 

Polecenie    wc

Polecenie wc ( word count – licznik słów) wyświetla liczbę wierszy, liczbę słów i liczbę znaków zawartych w pliku. Ostatnia nazwa w danych wynikowych to nazwa pliku. Można zobaczyć tylko część danych wynikowych używając poniższych opcji

 

OpcjaFunkcja

-c liczy znaki

-l liczy wiersze

-w liczy słowa

 

ls   |    wc  -l liczy liczbę plików znajdujących się w katalogu – dlaczego

 

Polecenie    sort

Polecenie sort układa wiersze pliku w określonym porządku zgodnie z wartościami pewnych pól zawartymi w każdym pliku. Pola takie nazywamy kluczami sortowania np. kluczem sortowania w pliku zawierającym dane każdego obywatela może być numer Pesel lub nazwisko .

Klucze sortowania określane dla polecenia sort mogą być polami w których znajduje się ciąg znaków zakończony białą spacją  czyli znakiem tabulacji lub spacji, klucze sortowania mogą być także wyznaczane w oparciu o pozycje grupy  znaków w wierszu. Jeżeli pola są rozdzielone znakiem innym niż znak tabulacji trzeba w takim wypadku użyć   opcji -t i podać znak rozdzielający.

Na przykład w pliku passwd takim znakiem będzie  „:” . Jeżeli nie można podać jednoznacznie znaku rozdzielającego poszczególne pola w wierszu pliku to wtedy, to wtedy za pomocą zapisu  0.pozycja  znaku wyznaczyć początek i koniec klucza. Ważna funkcja polecenia sort jest funkcja łączenia plików, jest to możliwe pod warunkiem, ze pliki które chce się połączyć są juz uprzednio posortowane. W przypadku łączenia plików używamy opcji -m .Ogólna postać polecenia  sort ma następujący wygląd:

sort  [  - opcja  ]   [  plik  ]

 

Opcja Funkcja:

-d sortowanie w kolejności książki telefonicznej

-f sortowanie nie rozróżniające małych i wielkich liter

-i sortowanie ignorujące znaki spoza zakresu ASCII

-n sortowanie najpierw w kolejności liczbowej , a potem alfabetycznej

-r sortowanie odwracające kolejność danych wynikowych

 

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:

daemon:x:2:2:daemon:/sbin

shutdown:x:6:0:shutdown:/sbin:/sbin:/shutdown

halt:x:7:0:halt:/sbin:/sbin:/halt

ftp:x:14:50:FTP User:/home/ftp:

nobody:x:99:99:Nobody:/:

ola:x:519:504:Ola Pawlak:/home/ola:/bin/bash

 

$    sort  +3 –t’,’   liczba

1,un,one,ein                                                               8, huit,eight,acht

2,deux,two,zwei                                                           3,trois,three,drei

3,trois,three,drei                                                          1,un,one,ein

4,quatre,four,vier                                                         5,cinq,five,funf

5,cinq,five,funf                    →         sort        →             9,neuf,nine,neun

6,six,six,sechs                                                             6,six,six,sechs

7,sept,seven,sieben                                                     7,sept,seven,sieben

8,huit,eight,acht                                                           4,quatre,four,vier

9,neuf,nine,neun                                                          10,dix,ten,zen

10,dix,ten,zen                                                              2,deux,two,zwei

 

sort –n  liczba

1,un,one,ein

2,deux,two,zwei

3,trois,three,drei

4,quatre,four,vier

5,cinq,five,funf

6,six,six,sechs

7,sept,seven,sieben

8,huit,eight,acht

9,neuf,nine,neun

10,dix,ten,zen

 

$  sort  -t’,’ +3   liczba 8, 8,huit,eight,acht

3,trois,three,drei

1,un,one,ein

5,cinq,five,funf

9,neuf,nine,neun

6,six,six,sechs

7,sept,seven,sieben

4,quatre,four,vier

10,dix,ten,zen

2,deux,two,zwei

 

$  sort -t’,’ +1 -2

5,cinq,five,funf

2,deux,two,zwei

10,dix,ten,zen

8,huit,eight,acht

9,neuf,nine,neun

4,quatre,four,vier

7,sept,seven,sieben

6,six,six,sechs

3,trois,three,drei

1,un,one,ein

 

Polecenie uniq

Jak wiemy posortowane wyniki mogą zawierać powielone wiersze danych, czyli ten sam wiersz możw powtarzać sie 2 razy, za pomoca polecenia  uniq można takie powielone  wiersze usunąć.

 

Polecenie cut

Polecenie  cut (cut - ćiąć ) działa tak jak na to wskazuje nazwa, tnie wiersze pliku na częśći, które mogą byc nastepnie składane z powrotem w innym układzie. Polecenie cut działa na znakach lub na polach. Można również stosować te dwie metody jednocześnie.

 

Opcja Funkcja:

-f wskazuje pola które mają być wycięte

-d zmiana separatora

-s pozwala ignorować wiersze które nie zawieraja tabulacji lub separatora i nie wyświetla ich na standartowym wyjściu

 

Przećwiczmy polecenie sort i cut na konkretnym, przykładzie. Załóżmy, że dysponujemy plikiem nazwanym liczba który zawiera 10 wierszy a każdy wiersz zawi cztery kolumny które w różnych jezykach odliczają do 10. Separatorem każdej kolumny  jest  ",". Plik przedstawia się nastepująco:

 

$  cat  liczba

1,un,one,ein

10,dix,ten,zen

2,deux,two,zwei

3,trois,three,drei

4,quatre,four,vier

5,cinq,five,funf

6,six,six,sechs

7,sept,seven,sieben

8,huit,eight,acht

9,neuf,nine,neun

 

$  cut –f1,3  -d’,’

1,un,one,ein                                                  1,one

2,deux,two,zwei                                              2,two

3,trois,three,drei                                             3,three

4,quatre,four,vier                                            4,four

5,cinq,five,funf          →         cut          →          5,five

6,six,six,sechs                                                6,six

7,sept,seven,sieben                                         7,seven

8,huit,eight,acht                                              8,eight

9,neuf,nine,neun                                             9,nine

10,dix,ten,zen                                                 10,ten

 Opcja –f1,3 wskazuje, że wyselekcjonowane mają być kolumny  pierwsza i trzecia, opcja  -d wskazuje, ze separatorem kolumn jest   ",".

 

Polecenie paste

Polecenie paste (paste - sklej ) składa pliki na różne sposoby, przyjmuje jeden wiersz z jednego pliku i łaczy go z innym wierszem z innego pliku. Znak tabulacji jest zawsze domyślnym separatorem, mozna go jednak zmienić uzywając opcji  -d . Ogólna posatać polecenia  paste przedstawia sie nastepująco:

Paste   [ -opcja ]   [ plik1  ]   [plik2 ]

 

Opcja  Funkcja:

-d  sklej pliki korzystając z separatorów

-s  sklej kolejne wiersze plików

--  sklej dwa kolejne wiersze ze standarowego wejścia

-f  wybiera kolumny do wyświetlenia

 

Polecenie  join

Polecenie join (join – łączyć) jest udoskonaloną wersją polecenia paste. Należy jednak pamiętać, że program ten działa tylko wtedy, kiedy łączone pliki mają wspólne pole. Polecenie  join rozpoczyna działanie od poszukiwania wspólnego pola w łączonych plikach, jeżeli takiego pola nie znajdzie, nic nie zostanie wyświetlone. Polecenie  join domyślnie oczekuje, że wspólnym polem obu plików będzie pole pierwsze. Aby polecenie  join działało skutecznie zaleca się sortowanie każdego z plików.

 

Polecenie  split

Polecenie split dzieli plik na części składające się z 1000 linii.

$  split  -500   plik1   maly

 

$ ls

plik1   malya malyb malyc

 

Polecenie grep

Polecenie grep (globally look for a regular expression and print – co na polski można przetłumaczyć: wyszukaj w pliku napisów spełniających wyrażenie regularne i wyświetl je) służy do znalezienia każdego wystąpienia słowa – ciągu znaków, frazy – w pliku utworzonym w systemie Linux. Ogólny wzór polecenia grep można przedstawić następująco:

grep  [ opcja ]   [ -e ]  [ wzór ]    [nazwa pliku]

 

Opcja Funkcie

-b wyświetla odnalezione miejsca

-c wyświetla liczbe odnalezionych wyrażeń

-i ignoruje różnice w wielkości liter

-l wyświetla tylko nazy plików w których odnaleziony został wzór

-n wyświetla numer każdego wiersza, w którym został odnaleziony wzór

-v wyświetla tylko te wiersze, które nie zawierają wzoru

 

Przetestujmy polecenie grep na pliku, który przedstawia się następująco:

$ cat   poemat

Opadają kwasem wina

Liście dębu i czereśni

I zza wody psi przyleśni

Szczekaja jak mandolina

 

Bałałajke psiej tęsknoty

Uwiązali na łańcuchu

Za to zdzierze-mgle na uchu

Dynda miesiąc – kolczyk złoty

 

$  grep  ‘’psi’’  poemat

Opadają kwasem wina

Liście dębu i czereśni

I zza wody psi przyleśni

Szczekaja jak mandolina                                               ... I zza wody psi przyleśni

→          grep          →          Bałałajke psiej tęsknoty

Bałałajke psiej tęsknoty

Uwiązali na łańcuchu

Za to ździerze-mgle na uchu

Dynda miesiąc – kolczyk złoty

 

Polecenie  grep selekcjonuje z pliku linie zawierające poszukiwany ciąg znaków – w naszym przykładzie „psi”  - i wyświetla wskazane linie na ekranie. Opcja -i znosi różnice między małymi i dużymi literami. Jeżeli wystukamy:

grep  -i   ‘’za’’  poemat

I zza wody psi przyleśn

Za to ździerze-mgle na uchu

 

 

Opcja -c użyta z poleceniem grep umożliwia policzenie liczby liń zawartych w pliku (jakie inne polecenie wykonuje to samo ?).

$   grep  -c  poemat

8

 

Opcja  -n numeruje linie w pliku (jakie inne polecenie wykonuje to samo ? ).

grep  -n   poemat

1 Opadają kwasem wina

2 Liście dębu i czereśni

3 I zza wody psi przyleśni

4 Szczekaja jak mandolina

 

5 Bałałajke psiej tęsknoty

6 Uwiązali na łańcuchu

7 Za to ździerze-mgle na uchu

8 Dynda miesiąc – kolczyk złoty

 

 

Opcja -v wyświetla linie, które nie zawierają poszukiwanego ciągu znaków, w naszym pierwszym przykładzie, jeśli przed  „psi” dodamy  -v to otrzymamy:

$   grep  -v   ‘’psi’’  poemat

Opadają kwasem wina

Liście dębu i czereśni

Szczekaja jak mandolina

Uwiązali na łańcuchu

Za to ździerze-mgle na uchu

Dynda miesiąc – kolczyk złoty

 

Opcja -l jest użyteczna kiedy poszukujemy ciągu znaków w wielu plikach.

 

Polecenie  sed

Polecenie a właściwie edytor sed (ang. stream editor) czyli edytor strumienia linii jest narzędziem informatycznym używanym do wyszukiwania  - wg wzorca opartego zazwyczaj na regułach zdefiniowanych w wyrażeniach regularnych – linii w pliku, do ich zmieniania  wyświetlania na ekranie czy też skierowywania rezultatów manipulacji do nowego pliku. Ogólny wzorzec polecenia sed wygląda następująco:

sed  opcja  ‘wyszukiwany wzorzec’  nazwa_pliku

 

Trzeba pamiętać, że edytor sed pracuje tak jak każdy inny edytor z jednym bardzo ważnym wyjątkiem: pobiera polecenia w oparciu o nie przetwarza plik, ale zmiany nie są zapisywane do oryginalnego pliku. Zmodyfikowane dane przesyłane są na standardowe wyjście jako nowy plik. Dlatego też sed jest często używany jako filtr.

sed posiada następujące – główne- polecenia funkcje i opcje, których znaczenie przedstawiamy poniżej:

Opcje  Funkcje

-e pobierz polecenie edycji z wiersza polecenia

-n nie wyświetlaj wynikowych wierszy (tzw tryb cichy)

-f pobierz polecenia z pliku

 

Podajmy przykład:

$  sed  -n ‘polecenia edycji’  [ plik wejściowy  ]

 

Można zauważyć, że w pierwszym przypadku opcja -e nie jest potrzebna, ponieważ podane jest tylko jedno pole specjalne. Jeżeli chce się użyć więcej niż jednego polecenia wtedy skorzystać właśnie z opcji -e lub opcji -f. Polecenia edytora  sed  umieszczamy w apostrofach, ponieważ wiele z nich – jak się przekonamy – zawiera znaki specjalne i wyrażenia regularne. Zasada działania edytora sed jest następująca. Edytor pobiera wiersz z pliku i stosuje do niego wszystkie polecenia edycyjne w kolejności ich wpisywania.

 

Polecenie  Opis

a dołącz tekst w pliku wyjściowym

c zastąp wybrane wiersze nowym tekstem

d usuń wiersze z pliku i przejdź do następnego wiersza usuwane wiersze nie są wyświetlane

i\ wstaw tekst w pliku wyjściowym -

p drukuj określone wiersze z pliku (może być używane do wybrania wierszy z pliku)

h skopiuj bieżący wiersz do bufora

q wyście z edytora sed

r wczytywanie wierszy z pliku i wyświetlanie ich na ekranie

! zaprzeczenie liniom wyszukiwanym przez wzorzec

l wyświetl wybrane wiersze

s zastąp pierwszy napis drugim

 

Edytor  sed omówimy bardzo dokładnie w rozdziale 8, natomiast teraz przedstawimy kilka przykładów które umozliwią zrozumienie jak - to jedno z najbardziej skomplikowanych poleceń Linuksa -  funkcjonuje. Najprościej zrozumieć działanie edytora na podstawie przykładów. W tym podrozdziale przedstawimy kilka przykładów polecenia sed wykorzystującego funkcje  s czyli zastępowania. Załózmy że posiadamy w katalogu domowym plik o nazwie programowanie_bash w którym chcemy zamienić słowo  bash pisane z małej litery na Bash pisane z dużej litery.

$  sed  `s/bash/Bash/g`  programowanie_bash

 

Powyższe polecenia zastąpi wszystkie wystąpienia (tzw. znacznik  g) napisu bash napisem Bash we wszystkich wierszach pliku programowanie_bash. Pominięcie znacznika g   oznaczałoby zastąpienie tylko pierwszego wystąpienia napisu bash na bash w pliku. Jak widzimy ogólny wzór zastąpienia jednego ciągu znaków przez inny ciąg znaków wygląda następująco:

 

s/stary ciąg znaków/nowy ciąg znaków/

 

s/stary ciąg znaków/nowy ciąg znaków/g g oznacza zastąp wszystkie wystąpienia wzorca znaków

 

s/stary ciąg znaków/nowy ciąg znaków/p p  oznacza wyświetl wiersz po wykonaniu zastąpienia

 

 

Warto w tym podrozdziale zapoznać się także z opcją d usuwania wierszy. Jeżeli chcemy usunąć z pliky 10 pierwszych wierszy to polecenie sed będzie miało następującą postać:

 

$  sed  `1,10d`  programowanie_bash

 

Znak  ^  oznacza początek linii .

Znak  $  oznacza koniec linii.

 

 

Następujące polecenie usunie wszystkie puste wiersze z pliku:

$  sed `/^$/d`  programowanie_bash

 

Polecenie  tr

Polecenie tr (translate ) umożliwia zmianę standardowego wejścia znak po znaku  a nie wiersz po wierszu. Ogólna postać polecenia tr jest nieco inna od tej do której przyzwyczaił się już zapewne czytelnik. Należy koniecznie pamiętać o tym, że struktura polecenia  tr  pozwala jedynie na podanie dwóch zestawów znaków, ale nie nazwy pliku.

tr   [ nazwa znaków ]  [ nowa nazwa znaków ]

 

Nazwę pliku podajemy poleceniu przekierowując wejście

tr    [ nazwa znaków ] [ nowa nazwa znaków ]  <  plik1  > plik2

 

Załóżmy że dysponujemy plikiem o nazwie plik1, którego zawartość wygląda następująco:

 

$ cat  plik1

warszawa

paryz

praga

moskwa

 

Aby nazwy stolic pisać tylko dużymi literami należy w następujący sposób użyć polecenia tr:

$  tr  ‘[a-z]  ‘ [A-Z]   <  plik1   > plik2

 

Opcja Funkcja:

-d wymazanie pewnych znaków

-s wymazanie powtórzeń

 

Podajmy kilka przykładów wyjaśniających działanie polecenia tr i opcji:

$  tr   ‘a,/’   ‘A;_’   <  plik1   > plik2

 

$ tr  -s  ‘ ‘  <  plik1   >  plik2

 

lower wszystkie znaki z małej litery

upper wszystkie znaki z dużej litery

print wszystkie znaki drukowane

punct znaki przystankowe

space wszystkie odstępy

alnum znaki alfanumeryczne

digit tylko cyfry

cntrl znaki kontrolne

alpha tylko litery

graph znaki drukowalne oprócz odstępów

 

$  tr  ‘[:lower:]’   ‘[:upper:]’  <  plik1  > plik2

 

 

Kurs Linux - Filtry Linux