08.03.2017, 00*59Systemy Operacyjne - Lekcja 4 - Segment 1 Strona 1 z 6http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT...
8 downloads
19 Views
185KB Size
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
6. Filtry Filtry to grupa programów służących do wyszukiwania wzorców i/lub przetwarzania plików tekstowych. Programy te są bardzo często wykorzystywane do tworzenia poleceń i aliasów powłoki, skrytów instalacyjnych oraz skryptów przeznaczonych do wykonywania złożonych zadań administracyjnych. Nie jest to jedyne zastosowanie filtrów, gdyż przydatne mogą być one wszędzie tam gdzie zachodzi konieczność nietrywialnego wyszukiwania danych w dużej liczbie plików lub w plikach o bardzo dużej objętości (często okoliczności te występują jednocześnie) - na przykład w zastosowaniach inżynierskich do przetwarzania wyników symulacji do postaci umożliwiającej wykonania żądanych zestawień i wykresów.
(6.1) Program grep Program grep poszukuje w standardowym strumieniu wejściowym lub w plikach wejściowych wierszy, które pasują do podanego wzorca. Każdy znaleziony wiersz jest przesyłany w całości na standardowy strumień wyjściowy, o ile nie zastosowano opcji zmieniającej to zachowanie. Wzorzec ma postać dowolnego wyrażenia, w którym mogą wystąpić znaki specjalne. Postać wywołania programu jest następująca: grep [opcje] wzorzec [plik]... gdzie: wzorzec - wyrażenie opisujące poszukiwany wzorzec, plik
- nazwa pliku wejściowego - jeśli pominięta grep czyta dane ze strumienia wejściowego,
opcje
- lista wybranych opcji .
Znaki specjalne rozpoznawane przez program grep pokazane w tablicy 4.7:
Tablica 4.7 Znaki specjalne programu grep Znak
Znaczenie
^
Początek wiersza.
$
Koniec wiersza.
.
Jeden dowolny znak.
*
Dowolna liczba wystąpień poprzedzającego wyrażenia (w tym zero wystąpień).
[]
Jeden dowolny znak z listy zawartej wewnątrz nawiasów.
[-]
Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.
\
Przywraca pierwotne znaczenie następnego znaku.
Jak widać są to znaki, które są również znakami specjalnymi powłoki. Jeśli wyrażenie opisujące wzorzec zawiera takie znaki to powinno zostać umieszczone w apostrofach, np.: ls * | grep '^[Z].[a-d]*graf\.c$'. http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 1 z 6
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
W ten sposób powłoka nie dokona interpretacji tekstu wzorca i zostanie ono przekazany w oryginalnej postaci programowi grep. Najczęściej stosowane opcje programu grep to: -c - podaje tylko liczbę dopasowanych linii, -n - dopisuje numer przed każdą dopasowaną linią, -v - wypisuje tylko te linie, które nie pasują do wzorca. Dostępne są też dwie odmiany programu grep: fgrep i egrep. Program fgrep dopuszcza stosowanie tylko uproszczonych wzorców, które nie zawierają żadnych znaków specjalnych. Inaczej mówiąc wzorzec jest dokładnie takim tekstem jakiego poszukujemy w danych wejściowych, np.: ps -ef | fgrep inetd W przypadku programu egrep stosować można wzroce o rozszerzonym zakresie znaków specjlanych. Niektóre dodatkowe znaki specjalne pokazano w tablicy 4.8.
Tablica 4.8 Dodatkowe znaki specjalne programu egrep Znak
Znaczenie
+
Liczba wystąpień poprzedzającego wyrażenia > 1.
?
Liczba wystąpień poprzedzającego wyrażenia = 0 lub 1.
{n}
Poprzedzające wyrażenie powtarza się dokładnie n razy.
(6.2) Edytor strumieniowy sed Program sed służy do edycji strumieni danych. Znajduje zastosowanie przy tworzeniu filtrów do przetwarzania wsadowego, przy edycji dużych plików, które nie mieszczą się w buforze, przy przetwarzaniu potokowym oraz w skryptach shellowych. Edytor sed przesyła strumień wejściowy lub zawartość plików wejściowych do strumienia wyjściowego, wykonując operacje edycyjne kolejno na każdej linii, zgodnie z podanym programem. Program zawiera polecenia, poprzedzone adresami linii wejściowych, do których powinny być zastosowane. Edytor kolejno kopiuje jedną linię do przestrzeni roboczej (do bufora roboczego) i stosuje do niej sekwencję tych poleceń, których adresy wskazują daną linię. Następnie przesyła linię do strumienia wyjściowego oraz czyści bufor roboczy. Niektóre polecenia wykorzystują bufor pomocniczy do zapamiętywania fragmentów tekstu. Wywołanie programu sed może przybrać jedną z następujących postaci: sed [-n] 'program' [plik_danych ...] sed [-n] -e 'program' [-e 'program']... [-f plik_z_programem]... http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 2 z 6
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
[plik_danych...] sed [-n] -f plik-z-programem [-f plik_z_programem]... [-e 'program']... [plik_danych...] gdzie: program
- program opisujący operacje edycyjne,
-e 'program'
- pobranie programu z linii polecenia, znaki ' ' zabezpieczają przed interpretacją elementów programu przez powłokę shell,
-f - pobranie programu z pliku plik_z_programem, plik_z_programem plik_danych
- plik wejściowy - jeśli pominięty to sed czyta dane ze strumienia wejściowego,
-n
- przesyła na wyjście tylko wskazane w programie linie.
Program musi być wywołany przynajmniej z jedną opcją -e lub -f. Pojedyńczą opcję -e można pominąć, podając jedynie program. Program dla edytora sed składa się z linii zawierających adres oraz polecenie z argumentami lub zestaw poleceń. Każda linia może przyjąć jedną z następujących postaci: [adres] polecenie [argumenty] [adres] { lista poleceń } Polecenia wykonywane są w kolejności występowania w programie. Kolejność tę można zmienić poprzez wykonanie skoku do etykiety. Polecenie może być poprzedzone 1 lub 2 adresami lub też pozbawione adresu . Polecenie z jednym adresem stosowane jest do linii wskazanych przez adres. Polecenie z dwoma adresami stosowane jest do zakresu ograniczonego liniami wskazanymi przez adresy. Polecenie bez adresu stosowane jest do każdej linii wejściowej. Adresowanie linii może odbywać się poprzez podanie numeru linii (adres numeryczny) lub przez podanie jej kontekstu (adres kontekstowy). Adresy numeryczne są podawane w postaci: [nr1[, nr2]] a adresy kontekstowe jako:
http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 3 z 6
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
[/wzorzec[/][, /wzorzec[/]] Adresy numeryczne są więc parą liczb całkowitych dodatnich lub jest to jedna taka liczba. Program sed korzysta z własnego licznika linii, który kumuluje ich liczbę dla wszystkich plików wejściowych łącznie. Znak $ identyfikuje ostatnią linię w ostatnim pliku. Adresy kontekstowe mają postać wzorca ograniczonego dwoma identycznymi znakami: /wzorzec/ lub \znak wzorzec znak Wzorzec jest dowolnym wyrażeniem, w którym mogą wystąpić znaki specjalne. Edytor rozpoznaje następujące znaki (tablica 4.9):
Tablica 4.9 Znaki specjalne programu sed Znak
Znaczenie
^
Początek linii.
$
Koniec linii.
\n
Znak nowej linii z wyjątkiem ostatniego znaku w buforze.
.
Jeden dowolny znak.
*
Dowolna liczba wystąpień poprzedzającego wyrażenia.
[ ]
Jeden dowolny znak z listy zawartej wewnątrz nawiasów.
[ - ]
Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.
[^...]
Jeden dowolny znak z wyjątkiem tych, podanych wewnątrz nawiasów oraz kończącego bufor znaku nowej linii.
\
Przywraca pierwotne znaczenie następnego znaku.
\( \nr
\) Określa pole, do którego można odwołać się poprzez numer. Odwołanie do pola o numerze nr (nr = 0 - 9).
Polecenia edytora sed można podzielić na trzy grupy: 1. polecenia edycyjne, 2. polecenia wejścia/wyjścia, 3. polecenia sterujące. Polecenia te są zgromadzone w tablicach 4.10, 4.11 i 4.12.
Tablica 4.10 Polecenia edycyjne programu sed Polecenie
Opis
[adres]d
Usuwanie wskazanych linii.
[adres]n
Wczytanie do przestrzeni roboczej kolejnej linii. Bieżąca linia jest przesyłana na stdout.
[adres]a \[RETURN] text
Wstawianie podanego tekstu za wskazaną linią (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).
http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 4 z 6
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
[adres]i \[RETURN] text
Wstawianie podanego tekstu przed wskazaną linią (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).
[adres]c \[RETURN] text
Wstawianie podanego tekstu zamiast wskazanych linii (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).
[adres]s/wzorzec/tekst/flagi Zamiana fragmentu linii, który pasuje do wzorca na podany tekst (zamiast znaków // mogą być użyte dowolne inne). Wyrażenie specjalne, które może zawierać znaki specjalne.
wzorzec
Ciąg znaków, w którym można zastosować symbole & i \d:
tekst
& - będzie zawierał napis pasujący do wzorca, \d - będzie zawierał podstring numer d pasujący do fragmentu wzorca pomiędzy znakami \( \). Opcje dla polecenia zamiany:
flagi
n - zamienia n wystąpień, n = 1 - 512, g - zamienia globalnie wszystkie wystąpienia wzorca, p - przesyła linię na wyjście, jeśli nastąpiła zamiana, w plik - przesyła linię do pliku plik, jeśli nastąpiła zamiana.
Tablica 4.11 Polecenia wejścia/wyjścia programu sed Polecenie
Opis
[adres]p
Przesłanie wskazanych linii na stdout.
[adres]=
Przesłanie numerów wskazanych linii na stdout.
[adres]w plik Zapisanie wskazanych linii do pliku. [adres]r plik Wstawienie zawartości pliku za wskazaną linią.
Tablica 4.12 Polecenia sterujące programu sed Polecenie [adres]! funkcja
Opis Zastosowanie podanej funkcji tylko do linii nie wybranych przez adres.
[adres]{ polecenia } Grupowanie poleceń. : etykieta
Ustawienie etykiety.
[adres]b etykieta
Skok do etykiety lub na koniec programu, gdy jej brak.
http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 5 z 6
Systemy Operacyjne - Lekcja 4 - Segment 1
08.03.2017, 00*59
[adres]t etykieta
Skok do etykiety, jeśli nastąpiły jakieś zmiany w bieżącej linii.
#
Linia komentarza.
#n
Jeśli występuje w pierwszej linii programu, wyłącza standardowe przesyłanie na stdout.
[adres]q
Skok na koniec programu i zakończenie jego działania.
Przykłady Polecenie wyszukujące w pliku wejściowym linie zaczynające się od dwukrotnego wystąpienia dowolnego wzorca (rozdzielonych spacją): sed -n '/^\(.*\) \1/p' plik Polecenie wypisujące zawartość pliku zamieniając wystąpienia wzorca tekst1 na wzorzec tekst2: sed 's/tekst1/tekst2/g' plik
http://oldwww.imio.pw.edu.pl/wwwvlsi/cad/teaching/soe/materialy/LEKCJA4/SEGMENT6/MAIN.HTM
Strona 6 z 6