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
Opcja → Funkcja
-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