Spis treści

SED i AWK

Do przygotowania

Wprowadzenie

Wyrażenia regularne

Definiowanie wyrażeń regularnych

Przykłady

Kod pocztowy

Polski kod pocztowy składa się z pięciu cyfr i myślnika wstawionego po drugiej cyfrze. Przy pomocy wyrażeń regularnych wzorzec kodu pocztowego może być zdefiniowany następująco:

Liczby dużego lotka

W dużym lotku losowane są liczby od 1 do 49. Przy pomocy wyrażenia regularnego można sprawdzić czy dana liczba może być wylosowana w dużym lotku. Należy wyrażenia zdefiniować następująco:

Adres MAC

Adres MAC jest 48-bitowym numerem karty sieciowej. Najczęściej zapisuje się go w postaci heksadecymalnej. Po każdych dwóch znakach może występować (ale nie musi) separator (najczęściej są to: dwukropek, myślnik, spacja). Przykładowy format adresu MAC to:

Wyrażenie regularne akceptujące powyższe zapisy może być zdefiniowane następująco:

  1. [A-Fa-f0-9]{2} - pierwsze dwa znaki (8 bitów bez separatora),
  2. [-: ]? - separatory występujące co najwyżej jeden raz,
  3. [A-Fa-f0-9]{2} - kolejne części adresu (ostatnie 40 bitów)
  4. Wyrażenie składające się z wyr. 2 i 3 trzeba powtórzyć 5 razy: ([-: ]?[A-Fa-f0-9]{2}){5}
  5. Czyli całość może wyglądać następująco: ^[A-Fa-f0-9]{2}([-: ]?[A-Fa-f0-9]{2}){5}$

SED

AWK

Ćwiczenia

SED

Przeczytać manual do programu. Zwrócić uwagę na polecenia, ich składnię oraz sposób adresacji poleceń.

  1. Wyświetlić plik /etc/passwd przy pomocy sed.
  2. Zamienić separator - dwukropek - w pliku /etc/passwd na spację.
  3. Wyświetlić tylko loginy użytkowników zapisanych w pliku /etc/passwd
  4. Wyświetlić 4, 7, 10 i 13 linię pliku /etc/passwd
  5. Wyświetlić określone przedziałem (np. od 3. do 5. włącznie) linie pliku /etc/passwd.
  6. Wyświetlić linie pliku /etc/passwd opisujące osoby mające login zaczynający się na 'z'.
  7. Wyświetlić linie pliku /etc/passwd opisujące osoby mające login zaczynający się na 'w' lub 'z'.
  8. Jak przy pomocy sed zaimitować polecenie grep -v? np. dla frazy 'lo' (grep -v lo /etc/networks)
  9. Jak zamienić w pliku wszystkie słowa root na twój login (przetestuj na pliku /etc/aliases)?
  10. Jak zamienić słowo 'root' na twój login w pliku, ale tylko w wierszach, w których występuje 'www'? A jak tam gdzie nie występuje?
  11. Jak usunąć z pliku puste linie?
  12. Jak zamienić przy pomocy sed wszystkie litery 'r' na 'k'?
  13. W jaki sposób zakodować szyfrem ROT13 plik przy pomocy sed (szyfr zamienia litery na występujące 13 liter dalej, np. a↔n, b↔o, itd.)?
  14. Przy pomocy polecenia sed zakomentuj linijkę link-local w pliku /etc/networks.
  15. 8-o W jaki sposób przy użyciu sed wstawić kolumnę X po pierwszym znaku wiersza (dodatkowy znak X w każdym wierszu)? A jak po piątym?
  16. Jak przy pomocy sed powtórzyć 3 razy pierwsze dwie litery każdego wiersza w pliku?
  17. Wylistuj wszystkie wiersze pliku /etc/mime.types zaczynające się od video i wyświetl ich numer.
  18. Napisz polecenie sed imitujące polecenie cut -d: -f2.
  19. W jaki sposób zmienić kolejność słów (np. w pliku /etc/aliases)?
    Jest: news: root
    Zrób: root: news
  20. 8-o Napisz polecenie sed imitujące cat -n.
  21. 8-o Napisać skrypt programu sed który ustawi powłokę startową wszystkim użytkownikom grupy is1 (folder domowy w katalogu is1) na /bin/tcsh. Skrypt ma wydrukować całą zawartość zmienionego pliku na ekranie wraz z zaznaczeniem zmienionych linii - tak jak jest to przedstawione poniżej.
    ----------------------------
    linia w której nastąpiła zmiana powłoki
    ----------------------------
  22. 8-o Napisać skrypt programu sed wyświetlający linię zawarte w pliku /etc/passwd w odwrotnej kolejności.

AWK

Ćwiczenia

  1. Przeczytać manual do programu zwrócić uwagę na:
    • wbudowane zmienne,
    • wbudowane funkcje,
    • wbudowane instrukcje sterujące.
  2. Jak awk interpretuje spacje?
  3. Co określają następujące zmienne: FS, RS, NF, NR, OFS, ORS?
  4. Kiedy wykonywane są instrukcje zawarte w blokach BEGIN oraz END w przypadku kiedy zródło danych składa się z wielu plików?
  5. Zapisać dowolną stronę internetową (może być także ta) w formacie HTML. Wyświetlić jej zawartość przy pomocy polecenia cat a następnie przy pomocy programu awk usunąć wszystkie znaczniki HTML z treści. Rezultat należy wyświetlić na ekranie.
  6. Do powyższego zadania dopisać element filtru, który usunie wszystkie puste linie, oraz te które posiadają tylko białe znaki.

Zadania


8-) 8-) 8-) Zadanie1

Przeanalizować poniższy skrypt (plik userlist):

#!/bin/sh

who | awk '{print $1}' | sort | uniq | xargs -i"{}" grep -e "^{}:" /etc/passwd | awk -f awkuserlist

oraz plik awkuserlist (skrypt programu awk) który jest w nim wykorzystany:

BEGIN {
    FS=":"
    print "<xml version="1.0">";
}
{
    match($5, "^[^, ]*");
    imie=substr($5, RSTART, RLENGTH);
    match($5, " [^, ]*");
    nazwisko=substr($5, RSTART+1, RLENGTH-1);
    login=$1;
    uid=$3;
    gid=$4;
    home=$6;
    shell=$7;
    print "<osoba>";
    print "<imie>"imie"</imie>";
    print "<nazwisko>"nazwisko"</nazwisko>";
    print "<login>"login"</login>";
    print "<uid>"uid"</uid>";
    print "<gid>"gid"</gid>";
    print "<home>"home"</home>";
    print "<shell>"shell"</shell>";
    print "</osoba>";
}
END {
    print "</xml>";
}
<osoba>
     <dana1>wartosc1</dana1>
     <dana2>wartosc2</dana2>
     <dana3>wartosc3</dana3>
     <dana4>wartosc4</dana4>
</osoba>
-------------------------------------------
dana1: wartosc1
dana2: wartosc2
dana3: wartosc3
dana4: wartosc4
-------------------------------------------
<osoba>
     <imie>Jan</imie>
     <nazwisko>Kowalski</nazwisko>
     <login>jkowalski</login>
     <uid>1</uid>
     <gid>1</gid>
     <home>/home/users/jkowalski</home>
     <shell>/bin/bash</shell>
     <miasto>Kraków</miasto>
</osoba>
-------------------------------------------
imie: Jan
nazwisko: Kowalski
login: jkowalski
uid: 1
gid: 1
home: /home/users/jkowalski
shell: /bin/bash
miasto: Kraków
-------------------------------------------


8-) 8-) 8-) Zadanie 2

BibTeX to narzędzie służące do formatowania bibliografii. Operuje ono na danych zawartych w plikach o rozszerzeniu „bib” zawierających dane bibliograficzne. Przykład pliku: publikacje.bib.txt.

Poszczególne wpisy bibliograficzne mają następującą postać:

@rodzaj{klucz,
  author = {wartość},
  title = {wartość},
  year = wartość,
  other = {wartość}
}

Zadanie polega na stworzeniu skryptu bash, który przy użyciu awk wybierze z pliku tylko te wpisy bibliograficzne, które odpowiadają zapytaniu użytkownika. Tzn. skrypt zapisany w pliku szukaj powinien obsługiwać następujące opcje (-a, -t, -k):


8-) 8-) 8-) Zadanie 3

Napisz skrypt programu awk który policzy i wyświetli średnią ocen dla każdego studenta. Lista studentów oraz ocen jest zapisana w pliku, którego nazwę podajemy jako parametr uruchomienia programu awk (nazwa pliku nie może być zakodowana wewnątrz skryptu). Format pliku zawierającego listę studentów oraz ocen jest następujący:

login_1:ocena_1,ocena_2,ocena_3
login_2:ocena_1,ocena_2,ocena_3,ocena_4

Należy przyjąć następujące założenia:

  1. login_n - jest loginem danego studenta.
  2. login_n - istnieje w pliku /etc/passwd.
  3. Liczba studentów nie jest określona, definiuje ją tylko i wyłącznie liczba linii w pliku.
  4. Plik zawiera tylko linie w powyższym formacie - przyjmujemy jako aksjomat i nie weryfikujemy tej kwestii.
  5. ocena_n - oznacza ocenę, liczbę ze zbioru {2.0, 3.0, 3.5, 4.0, 4.5, 5.0} (nie ma przymusu sprawdzania poprawności - przyjmujemy że oceny są wpisane poprawnie).
  6. Liczba ocen dla każdego studenta nie jest określona i może być różna.
  7. Spacje w pliku nie wpływają na sposób jego przetwarzania.

Jako rezultat, skrypt powinien wyświetlić informację o uzyskanej średniej ocenie przez każdego studenta w następującym formacie:

Srednia ocena dla Imie Nazwisko wynosi: X

gdzie:

  1. Imie Nazwisko - oznaczają odpowiednio imię i nazwisko studenta pobrane z pliku /etc/passwd (uwaga: nie login jak to jest w pliku wejściowym).
  2. X - wartość średniej oceny z dokładnością do dwóch miejsc po przecinku.

Napisany skrypt nie może używać żadnych poleceń zewnętrznych.
Przykłady plików: wejściowego oraz wyjściowego.

Dla zainteresowanych