Interfejs uzytkownika - filtry

ŁF
<html> <body style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt;"> <style> table {font-size: 10pt} h3 { color: #000000; font-weight: bold; font-size: 18pt; background-color: #e8d5ba; text-align: center; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h4 { color: #000000; font-weight: bold; font-size: 16pt; background-color: #c5dcdc; text-align: center; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h5 { color: #000000; font-weight: normal; font-size: 11pt; background-color: #c5dcc5; text-align: left; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h6 { color: #0000cd; font-weight: bold; font-size: 12pt; font-family: monospace, Courier, "Courier CE"; text-align: left; text-indent: 10pt; word-spacing: 3pt; width: auto } em { color: #0000cd; font-weight: normal; font-size: 12pt; font-family: Courier, "Courier CE"; text-align: left; text-indent: 10pt; word-spacing: 0pt; width: auto } </style>

LINUX - Interfejs użytkownika.

4. INTERPRETER POLECEŃ

</span>

Filtry

</span>

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
</p>

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</span></caption>
<font size="+1">Znak</span>
</td>
<font size="+1">Znaczenie</span>
</td> </tr> </td> Początek wiersza.</td> </tr> $</td> Koniec wiersza.</td> </tr> .</td> Jeden dowolny znak.</td> </tr> *</td> Dowolna liczba wystąpień poprzedzającego wyrażenia (w tym zero wystąpień).</td> </tr> [ ]</td> Jeden dowolny znak z listy zawartej wewnątrz nawiasów.</td> </tr> [ - ]</td> Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.</td> </tr> \</td> Przywraca pierwotne znaczenie następnego znaku.</td> </tr> </table>

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 '</sup>[Z].[a-d]*graf\.c$'.

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</span></caption>
<font size="+1">Znak</span>
</td>
<font size="+1">Znaczenie</span>
</td> </tr> `+`</td> Liczba wystąpień poprzedzającego wyrażenia > 1.</td> </tr> `?`</td> Liczba wystąpień poprzedzającego wyrażenia = 0 lub 1.</td> </tr> `{n}`</td> Poprzedzające wyrażenie powtarza się dokładnie n razy.</td> </tr> </table>

(6.2) Edytor strumieniowy sed
</p>

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]... [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 plik_z_programem - pobranie programu z pliku 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:

[/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</span></caption>
<font size="+1">Znak </span>
</td>
<font size="+1">Znaczenie</span>
</td> </tr> `^`</td> Początek linii.</td> </tr> `$`</td> Koniec linii.</td> </tr> `\n`</td> Znak nowej linii z wyjątkiem ostatniego znaku w buforze.</td> </tr> `.`</td> Jeden dowolny znak.</td> </tr> `*`</td> Dowolna liczba wystąpień poprzedzającego wyrażenia.</td> </tr> `[ ]`</td> Jeden dowolny znak z listy zawartej wewnątrz nawiasów.</td> </tr> `[ - ]`</td> Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.</td> </tr> `[^...]`</td> Jeden dowolny znak z wyjątkiem tych, podanych wewnątrz nawiasów oraz kończącego bufor znaku nowej linii.</td> </tr> `\`</td> Przywraca pierwotne znaczenie następnego znaku.</td> </tr> `\(`` `` `` \)`</td> Określa pole, do którego można odwołać się poprzez numer.</td> </tr> `\nr`</td> Odwołanie do pola o numerze nr (nr = 0 - 9).</td> </tr> </table>

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</span></caption>
<font size="+1">Polecenie</span>
</td>
<font size="+1">Opis</span>
</td> </tr> `[adres]d`</td> Usuwanie wskazanych linii.</td> </tr> `[adres]n`</td> Wczytanie do przestrzeni roboczej kolejnej linii. Bieżąca linia jest przesyłana na stdout.</td> </tr> `[adres]a \[RETURN]``
``text`</td> Wstawianie podanego tekstu za wskazaną linią (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).</td> </tr> `[adres]i \[RETURN]``
``text`</td> Wstawianie podanego tekstu przed wskazaną linią (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).</td> </tr> `[adres]c \[RETURN]``
``text`</td> Wstawianie podanego tekstu zamiast wskazanych linii (konieczne jest zastosowanie znaku przejścia do nowego wiersza [RETURN]).</td> </tr> `[adres]s/wzorzec/tekst/flagi`</td> Zamiana fragmentu linii, który pasuje do wzorca na podany tekst (zamiast znaków // mogą być użyte dowolne inne).</td> </tr>
`wzorzec`
</td> Wyrażenie specjalne, które może zawierać znaki specjalne.</td> </tr>
`tekst`
</td> Ciąg znaków, w którym można zastosować symbole & i \d:
  • & - będzie zawierał napis pasujący do wzorca,
  • \d - będzie zawierał podstring numer d pasujący do fragmentu wzorca pomiędzy znakami \(  \).
</td> </tr>
`flagi`
</td> Opcje dla polecenia zamiany:
  • 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.
</td> </tr> </table>




Tablica 4.11 Polecenia wejścia/wyjścia programu sed</span></caption>
<font size="+1">Polecenie</span>
</td>
<font size="+1">Opis</span>
</td> </tr> `[adres]p`</td> Przesłanie wskazanych linii na stdout.</td> </tr> `[adres]=`</td> Przesłanie numerów wskazanych linii na stdout.</td> </tr> `[adres]w plik`</td> Zapisanie wskazanych linii do pliku.</td> </tr> `[adres]r plik`</td> Wstawienie zawartości pliku za wskazaną linią.</td> </tr> </table>




Tablica 4.12 Polecenia sterujące programu sed</span></caption>
<font size="+1">Polecenie</span>
</td>
<font size="+1">Opis</span>
</td> </tr> `[adres]! funkcja`</td> Zastosowanie podanej funkcji tylko do linii nie wybranych przez adres.</td> </tr> `[adres]{ polecenia }`</td> Grupowanie poleceń.</td> </tr> `: etykieta`</td> Ustawienie etykiety.</td> </tr> `[adres]b etykieta`</td> Skok do etykiety lub na koniec programu, gdy jej brak.</td> </tr> `[adres]t etykieta`</td> Skok do etykiety, jeśli nastąpiły jakieś zmiany w bieżącej linii.</td> </tr> `#`</td> Linia komentarza.</td> </tr> `#n`</td> Jeśli występuje w pierwszej linii programu, wyłącza standardowe przesyłanie na stdout.</td> </tr> `[adres]q`</td> Skok na koniec programu i zakończenie jego działania.</td> </tr> </table>

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`

(6.3) Procesor tekstu awk
</p>

Awk jest językiem programowania przeznaczonym do przetwarzania tekstów. Stosowany jest do generowania raportów, wyszukiwania wzorców, filtrowania i formatowania danych przesyłanych innym programom. Oprócz podstawowej wersji awk istnieją również implementacje nazywane nawk i gawk o rozszerzonych możliwościach. Szczegółowe informacje o programie [ng]awk dostępnym w danym systemie można uzyskać dzięki poleceniu man. W dalszej części lekcji przekazane zostaną podstawowe informacje o posługiwaniu się programem awk.

Awk przetwarza zawartość strumienia wejściowego lub kolejnych plików wejściowych zgodnie z podanym programem. Program zawiera wzorce oraz związane z nimi akcje, które należy wykonać na danych wejściowych pasujących do wzorców. Zawartość każdego pliku wejściowego jest przeglądana jednokrotnie. Wywołanie programu awk może przyjmować dwie formy:

awk [-Fseparator_pola] 'program' [[-v] zmienna=wartość]... [plik]...
awk [-Fseparator_pola] -f plik_z_programem [[-v] zmienna=wartość]... [plik]...

gdzie:

program - program zawierający polecenia awk; znaki ' ' zapobiegają interpretacji przez powłokę shell,
-f plik_z_programem - pobranie programu z pliku,
-Fseparator_pola - ustawienie znaku separator_pola jako separatora pola w rekordzie,
plik - plik wejściowy zawierający tekst do przetworzenia,
[-v] zmienna=wartość - nadanie wartości zmiennej, która będzie dostępna w głównym module programu;
opcja -v udostępnia zmienną w module inicjującym.

Polecenie awk może być zastosowane na trzy różne sposoby:

  1. przez wywołanie awk wraz z programem w linii polecenia,
  2. przez wywołanie awk w linii polecenia, program umieszczony w pliku,
  3. przez wywołanie awk wraz z programem umieszczone w skrypcie shella.
<dl> <dt>Pierwszy sposób stosuje się w przypadku krótkich programów (jedna lub dwie linie), które nie będą często wykorzystywane. Programy dłuższe lub przeznaczone do częstego użytkowania umieszcza się na ogół w pliku. Najczęściej stosowany jest trzeci sposób. </dl>

Program awk przetwarza dane wejściowe według następującego algorytmu. Dane wejściowe dzielone są na rekordy zgodnie z występowaniem separatorów rekordu. Standardowo jest to znak nowego wiersza, ale można zmienić to ustawienie, przypisując inne znaki zmiennej RS. Awk wczytuje kolejno po jednym rekordzie do przestrzeni roboczej i dokonuje podziału na pola zgodnie z rozmieszczeniem separatorów pola. Zazwyczaj są to znaki spacji i tabulacji, lub inne ustawione w zmiennej FS lub w linii wywołania przez opcję -Fseparator_pola. Do poszczególnych pól można się odwoływać poprzez następujące zmienne:

`$0` - cały bieżący rekord,
`$1, $2 ...` - kolejne pola bieżącego rekordu,
`$NF` - ostatnie pole bieżącego rekordu.

Dodatkowo zdefiniowane są zmienne:

`NF` - liczba pól bieżącego rekordu,
`NR` - liczba dotychczas wczytanych rekordów,
`FNR` - liczba rekordów wczytanych z bieżącego pliku,

Bieżący rekord porównywany jest kolejno ze wszystkimi wzorcami w programie. W przypadku dopasowania wykonywane są akcje związane z danym wzorcem. Po wykonaniu całego programu następuje usunięcie rekordu z przestrzeni roboczej i wczytanie nowego. Program dla awk jest sekwencją instrukcji o następującej postaci:

wzorzec { akcja }

lub

wzorzec { blok akcji }

Poszczególne akcje w bloku mogą być oddzielone średnikiem lub znakiem nowego wiersza.
Pominięcie wzorca w instrukcji powoduje zastosowanie akcji do wszystkich rekordów wejściowych.
Pominięcie akcji powoduje przesłanie wszystkich pasujących rekordów do strumienia wyjściowego.
W programie można również umieścić linie komentarza rozpoczynające się znakiem #.

Pole wzorzec określa, czy związana z nim akcja ma zostać zastosowana do bieżącego rekordu. W programie można stosować trzy typy wzorców:

  • wzorce specjalne BEGIN i END,
  • izolowane wyrażenia specjalne,
  • wyrażenia wartościowane jako prawda lub fałsz.

W przypadku zastosowania konstrukcji BEGIN { akcja } akcja wykonywana jest na początku, jeszcze przed rozpoczęciem przetwarzania danych wejściowych. Daje to możliwość inicjalizacji zmiennych (np. separatorów rekordu RS i pola FS) lub wypisania nagłówków w raporcie.

W przypadku użycia konstrukcji END { akcja } akcja związanawykonywana jest po zakończeniu przetwarzania danych wejściowych. Umożliwia to np. umieszczenie podsumowania w raporcie.

Jeśki zastosujemy konstrukcję /wzorzec/ { akcja } to wzorzec może mieć postać izolowanego wyrażenia ze znakami specjalnymi, umieszczonego pomiędzy znakami / /.

Polecenie awk akceptuje następujący zestaw znaków specjalnych (tablica 4.13):

Tablica 4.13 Znaki specjalne programu awk</span></caption> <font size="+1">Znak</span></td> <font size="+1">Znaczenie</span></td> </tr> `^`</td> Początek wiersza.</td> </tr> `$`</td> Koniec wiersza.</td> </tr> `\n`</td> Znak nowego wiersza z wyjątkiem ostatniego znaku w buforze.</td> </tr> `.`</td> Jeden dowolny znak.</td> </tr> `*`</td> Zero lub więcej wystąpień poprzedzającego wyrażenia.</td> </tr> `+`</td> Jedno lub więcej wystąpień poprzedzającego wyrażenia.</td> </tr> `?`</td> Zero lub jedno wystąpienie poprzedzającego wyrażenia.</td> </tr> `|`</td> Jeden znak z pary.</td> </tr> `[ ]`</td> Jeden dowolny znak z listy zawartej wewnątrz nawiasów.</td> </tr> `[ - ]`</td> Jeden dowolny znak z zakresu podanego wewnątrz nawiasów.</td> </tr> `[^...]`</td> Jeden dowolny znak z wyjątkiem tych, podanych wewnątrz nawiasów oraz kończącego bufor znaku nowej linii.</td> </tr> `\`</td> Przywraca pierwotne znaczenie następnego znaku.</td> </tr> </table>

W ogólnym przypadku wzorzec przyjmuje postać dowolnego wyrażenia, któremu można przypisać wartość logiczną prawda lub fałsz. Wyrażenie może zawierać znaki specjalne oraz dowolne operatory. Najczęściej stosowane są operatory dopasowania wzorców np.:

string ~ /wzorzec/ { akcja }

string !~ /wzorzec/ { akcja }

oraz operatory relacji np.:

string1 == string2 { akcja }

liczba1 > liczba2 { akcja }

Blok akcji ma postać sekwencji poleceń wejściowych i wyjściowych, poleceń sterujacych oraz operacji przypisania wartości zmiennym.

W składni awk dostępne są następujące polecenia i pętle sterujące:

`if (``warunek``) { ``blok1`` } [ else { ``blok2`` } ]`

`while (``warunek``) {``blok``}`

`<font color="#0000cd">for (wyrażenie; wyrażenie; wyrażenie) { blok }</font>`

`for (``zmienna`` in ``tablica``) { ``blok`` }`

Wewnątrz bloków stosować można następujące instrukcje zmieniające wykonywanie pętli:

`break` - przerywa bieżący obieg pętli i rozpoczyna następny,
`continue` - przerywa bieżący obieg pętli i rozpoczyna go od początku,
`next` - przerywa wykonywanie programu dla bieżącego rekordu, wczytuje nowy rekord i rozpoczyna przetwarzanie od początku programu,
`exit` - przerywa wykonywanie programu.

Operacje wejścia /wyjścia mogą być realizowane za pomocą następujących instrukcji:

`print [wyrażenie][[,] wyrażenie]...` Wypisuje kolejne wyrażenia rozdzielone wyjściowym separatorem pola podanym w zmiennej OFS; na końcu umieszczany jest wyjściowy separator rekordu pamiętany w zmiennej ORS.
`printf (format, wyrażenie [, wyrażenie] ...)` Formatuje i wypisuje wyrażenie (składnia jak w języku C).
`getline` Wczytuje kolejny rekord z bieżącego pliku wejściowego do przestrzeni roboczej.
`getline zmienna` Wczytuje kolejny rekord z bieżącego pliku wejściowego do zmiennej, nie zmieniając zawartości przestrzeni roboczej.
`getline < plik` Wczytuje rekord z podanego pliku do przestrzeni roboczej.
`getline zmienna < plik` Wczytuje rekord z podanego pliku do zmiennej, nie zmieniając zawartości przestrzeni roboczej.
`system (polecenie shella)` Przekazuje polecenie do wykonania w shellu; strumień wyjściowy polecenia jest włączany w strumień wyjściowy awk.

W składni awk dostępne są zmienne skalarne, tablicowe jednowymiarowe oraz stałe numeryczne i tekstowe. Stałe tekstowe mają postać dowolnego napisu objętego znakami " ". Wartość zmiennej może być interpretowana jako tekst lub wartość numeryczna. Wszystkie zmienne są inicjalizowane napisem zerowym (wartość numeryczna 0). Operacja przypisania wartości zmiennej ma ogólną postać:

`zmienna operator wyrażenie`

Listę dostępnych operatorów zamieszczono w tablicy 4.14.
W przypadku tablic nie deklaruje się ich rozmiaru ani typu elementów. Nowe elementy pojawiają się w momencie pierwszego przypisania wartości. Indeksy tablicy mogą być dowolnymi napisami (w szczególności kolejnymi liczbami całkowitymi).

Wyrażenia występują zarówno we wzorcach jak i w akcjach. Mogą zawierać odwołania do stałych, zmiennych i do pól rekordów, wywołania funkcji oraz dowolne operatory spośród wymienionych poniżej:

Tablica 4.14 Operatory dostępne w programach awk</span></caption>
<font size="+1">Typ operatora</span>
</td>
<font size="+1">Operator</span>
</td> </tr> arytmetyczne</td> `+ , - , * , / , % , (...) , ^ `</td> </tr> przypisania</td> `= , += , -= , *= , /= , %= , ++ , -- `</td> </tr> relacji</td> `< , <= , == , != , > , >= `</td> </tr> logiczne</td> `|| , && , ! , ?: `</td> </tr> porównywania wzorców</td> `~ , !~ `</td> </tr> </table>

W programach awk można posługiwać się również predefiniowanymi funkcjami do operacji na tekstach oraz funkcjami numerycznymi. Są one pokazane w tablicach 4.15 i 4.16.

Tablica 4.15 Funkcje awk do operacji na tekstach</span></caption>
<font size="+1">Funkcja</span>
</td>
<font size="+1">Opis działania</span>
</td> </tr> `INDEX (s1, s2)`</td> Zwraca indeks pierwszego wystąpienia stringu s2 w stringu s1 lub 0, jeśli dopasowanie nie następuje.</td> </tr> `length (string)`</td> Zwraca długość stringu.</td> </tr> `match (string, wzorzec)`</td> Zwraca indeks pierwszego wystąpienia wzorca w stringu lub 0, jeśli dopasowanie nie następuje.</td> </tr> `split (string, tablica, separator)`</td> Dzieli string na pola (rozdzielone separatorami) oraz przypisuje kolejnym elementom tablicy; funkcja zwraca liczbę pól.</td> </tr> `substr (string, pozycja, długość)`</td> Zwraca podstring o podanej długości, rozpoczynający się od wskazanej pozycji.</td> </tr> `sprintf (format, wyrażenie [, wyrażenie]...)`</td> Formatuje wyrażenie i zwraca w postaci stringu.</td> </tr> `sub(wzorzec, nowy_podstring [, string])`</td> Zamienia pierwsze wystąpienie wzorca w danym stringu na nowy podstring.</td> </tr> `gsub(wzorzec, nowy_podstring [, string])`</td> Zamienia wszystkie wystąpienia wzorca w danym stringu na nowy podstring.</td> </tr> </table>

Tablica 4.16 Funkcje numeryczne awk</span></caption>
<font size="+1">Funkcja</span>
</td>
<font size="+1">Opis działania</span>
</td> </tr> `atan2 (y,x)`</td> arcus tangens y/x w radianach</td> </tr> `cos (rad)`</td> cosinus kąta rad</td> </tr> `exp (x)`</td> funkcja ex</td> </tr> `int (x)`</td> część całkowita x</td> </tr> `log (x)`</td> ogarytm naturalny z x</td> </tr> `rand ()`</td> generator liczb pseudolosowych z przedziału < 0, 1 ></td> </tr> `srand ([seed])`</td> inicjuje generator liczb pseudolosowych</td> </tr> `sin (rad)`</td> sinus kąta rad</td> </tr> `sqrt (x)`</td> pierwiastek kwadratowy z x</td> </tr> </table>

Oprócz funkcji standardowo dostępnych w awk użytkownik ma możliwość zdefiniowania własnych funkcji zgodnie z następującą składnią:

`<font color="#0000cd">function nazwa (arg... ) { ciało funkcji } </font>`

Wewnątrz ciała fukcji można skorzystać z funkcji:

`<font color="#0000cd">return (wyrażenie) </font>`

która zwraca wartość podanego wyrażenia.

W przypadku podania treści programu w wywołaniu polecenia awk, program umieszcza się w znakach ' '. Zapobiega to interpretowaniu znaków specjalnych awk przez powłokę shell. W niektórych przypadkach dopuszczenie do takiej interpretacji jest jednak konieczne, np. w celu udostępnienia argumentów wywołania skryptu w programie awk. Dokonuje się tego poprzez ograniczenie fragmentu programu, przeznaczonego do interpretacji, znakami ' '. Program zostaje w ten sposób "rozcięty" na dwie części zabezpieczone znakami ' ' oraz wskazany fragment pomiędzy nimi. Poniższy przykład ilustruje sposób pobrania wartości pierwszego argumentu wywołania skryptu:

awk ' ... '$1' ... '

Inną metodą jest rezygnacja z umieszczania całego programu pomiędzy znakami ' ' i zabezpieczanie jedynie wybranych fragmentów. Może to być jednak bardziej pracochłonne.

Przykład.
Poniżej podano kilka prostych przykładów zastosowania awk. Zachęcamy do ich przeanalizowania a nawet praktycznego przetestowania ich działania.

ps -ef | awk ' BEGIN {print "Procesy uzytkownika:"}
$1 ~ /lab1$/ {print $2, $8}
END {print "Koniec"} '

Polecenie wypisuje zawartość pliku zamieniając wystąpienia wzorca tekst1 na wzorzec tekst2:

awk '{gsub("tekst1", "tekst2", $0); print $0}' plik

awk '{gsub("tekst1", "tekst2"); print}' plik



Autorami powyższego artykułu są mgr inż. A. Wielgus i dr Z. Jaworski. Drobnych zmian i poprawek dokonał Ł. Fronczyk
W dziale źródła/C++ znajdują się przykładowe programy do tego i pozostałych artykułów z tego cyklu.
Wszelkie pytania proszę kierować na adres [email protected]

0 komentarzy