Potoki, strumienie i przekierowania (i)

Like most pipelines, this one will fail in mysterious ways under certain circumstances.

– The UNIX-HATERS Handbook

Deksryptory strumieni związanych z procesami (np. uruchomionymi komendami):

  1. standardowe wejście (stdin)
  2. standardowe wyjście (stdout)
  3. wyjście błędów (stderr)
  4. ...

Przekierowanie strumieni do plików

KOMENDA 1> PLIK lub KOMENDA > PLIK
przekieruj stdout procesu na początek pliku PLIK (więc plik zostanie nadpisany)
KOMENDA 2> PLIK
to samo dla stderr
KOMENDA 1>> PLIK lub KOMENDA >> PLIK
przekieruj stdout procesu na koniec pliku PLIK (więc dane będą dopisane na koniec pliku)
KOMENDA 2>> PLIK
to samo dla stderr
KOMENDA < PLIK lub < PLIK KOMENDA
otwórz plik PLIK i przekieruj jego zawartość na stdin procesu

Przykłady:

  • cat FILE1 > FILE2 – zapisz zawartość FILE1 do FILE2
  • man man > man
  • echo “ala ma kota” > plik
  • less < FILE1
  • < FILE1 less

Potoki

Potok (pipe) łączy stdout jednego procesu z stdin drugiego procesu:

KOMENDA_A | KOMENDA_B

Potok może łączyć ze sobą wiele procesów (tzw. pipeline).

KOMENDA_0 | KOMENDA_1 | ... | KOMENDA_N
stdout z komendy 0 jest podawane na stdin komendy 1, itp.

Przykłady:

  • cat PLIK | less – otwórz PLIK, podaj zawartość do komendy less (która pozwoli na przewijanie w górę/w dół)
  • cat PLIK1 | head -n 1 | cat PLIK2 – otwórz plik 1, wytnij tylko pierwszą linię, połacz pierwszą linie pliku 1 z plikiem 2

Czarna dziura

Istnieją dwa pliki czarnych dziur w systemie (data sinks):

  • /dev/null
  • /dev/zero

Wszelkie dane zapisane do tych plików zostają automatycznie usunięte (zignorowane).

Zadania:

  1. Uruchom komendę firefox (lub chromium lub opera) w terminalu
  2. Uruchom tą samą komendę przekierowując jej stdout i stderr do czarnej dziury
  3. Uruchom komendę find / z przekierowaniem tak, żeby nie wypisywała błędów na konsolę
  4. Uruchom komendę find / z przekierowaniem tak, żeby wypisywała na konsolę tylko błędy

Komendy potokowe

Potoki pozwalają łączyć komendy ad hoc w skomplikowane narzędzia do przetwarzania tekstu.

Wyświetlanie napisów

echo

wyświetl napis (podany przez argumenty)

-e interpretuj znaki specjalne (lista znaków specjalnych w podręczniku)
-n nie dodawaj na końcu znaku nowej linii

Przykłady:

  • echo hello world
  • echo "hello\nworld"
  • echo -e "hello\nworld"

Zadania:

  1. Utwórz plik PLIK1 o zawartości hello world za pomocą komendy echo.

  2. Dopisz komendą echo na koniec pliku PLIK1 tekst:

    linii: 1
    słów: 2
    znaków: 12
    

Łączenie plików

cat

konkatenacja plików (catenate)

cat FILE
wypisanie zawartości pliku
cat FILE1 FILE2
wypisanie skonkatenowanej zawartości pliku
-n, --number ponumeruj linie
-b, --number-nonblank
 ponumeruj niepuste linie
-s, --squeeze-blank
 pomiń puste linie
-E, --show-ends
 zaznacz koniec każdej lini znakiem $

Zadania:

  1. Uruchom komendy cat bez argumentów i wpisz kilka linii (zakończ znakiem końca strumienia)

  2. Za pomocą komendy cat utwórz plik PLIK2 o treści:

    We are using Linux daily to UP our productivity.
    So UP yours!
    
            -- Adapted from Pat Paulsen by Joe Sloan
    
  3. Za pomocą komendy cat skopiuj zawartość pliku PLIK2 do PLIK3

  4. Za pomocą komendy cat połącz zawartość plików PLIK2 i PLIK1 i zapisz ją do pliku PLIK3

  5. Wyświetl zawartośc pliku PLIK3 z ponmumerowanymi liniami

tac

cat od tyłu

Zadania:

  1. Uruchom komendy tac bez argumentów i wpisz kilka linii
  2. Za pomocą komendy tac skopiuj zawartość pliku PLIK2 do PLIK4
  3. Wyświetl zawartośc pliku PLIK2 za pomocą komendy tac
  4. Wyświetl zawartośc pliku PLIK2 za pomocą komend tac tak, żeby kolejność linii nie była odwrócona

Filtry

more
stronnicowanie tekstu (<spacja> – następna strona, q – wyjście)
less
przewijanie tekstu (<↑>/<↓> – przewijanie góra/dół, <pgup>/<pgdn> – poprzednia/następna strona, q – wyjście)

Zadania:

  1. Za pomocą komendy ls utwórz plik PLIK5 którego zawartość to lista plików i katalogów w katalogu dev
  2. Wyświetl zawartość pliku PLIK5 ze stronnicowaniem za pomocą more
  3. Wyświetl zawartość pliku PLIK5 z przewijaniem za pomocą less
  4. Wyświetl zawartość katalogu /dev ze stronnicowaniem za pomocą more (bez używania dodatkowych plików)
  5. Wyświetl zawartość katalogu /dev z przewijaniem za pomocą less (bez używania dodatkowych plików)
  6. Wyświetl zawartość katalogu /dev, odwróć kolejność listy wyników i pozwól
head

czyta początek pliku (strumienia) - domyślnie 10 linii

-n, --lines=K czytaj K pierwszych linii; jeśli K zaczyna się od znaku -, czytaj wszystkie linie pliku oprócz K ostatnich
tail

czyta koniec pliku (strumienia) - domyślnie 10 linii

-n, --lines=K czytaj K ostatnich linii; jeśli K zaczyna się od znaku +, czytaj wszystkie linie pliku oprócz K pierwszych
-f, --follow nie przerywaj czytania, wyświetlaj dane dopisywane do pliku w miare jak się pojawiają

Zadania:

  1. Odczytaj zawartość pliku PLIK5 numerując linie (cat) i wyświetl tylko pierwsze 10 linii (head)
  2. Odczytaj zawartość pliku PLIK5 numerując linie (cat) i wyświetl tylko pierwszą linię (head)
  3. Odczytaj zawartość pliku PLIK5 numerując linie (cat) i wyświetl tylko ostatnie 10 linii (tail)
  4. Odczytaj zawartość pliku PLIK5 numerując linie (cat) i wyświetl tylko ostatnią linię (tail)
  5. Odczytaj zawartość pliku PLIK5 numerując linie (cat) i wyświetl tylko 5 linię (head i tail)
tr

tłumaczenie znaków (na inne znaki) (translate)

-s, --squeeze zamiast tłumaczyć, usuń powtórzenia
-d, --delete zamiast tłumaczyć, usuń znaki
--complement zamiast wykonywać operacje dla wskazanego zbioru znaków, wykonuj ją dla wszystkiego co nie mieści się we wskazanym zbiorze znaków (dopełnienie)

Klasy znaków: [upper:], [:lower:], [:alpha:], etc. (man tr – dokładny opis wszystkich klas)

Przykłady:

  • tr ab '.?' – zamień wszystkie litery a na kropki, wszystkie litery b na znaki zapytania
  • tr -d a – usuń wszystkie znaki a
  • tr -cd a – usuń wszystkie znaki inne niż a
  • tr -s ' ' – usuń wszystkie powtarzające się spacje

Zadania:

  1. Utwórz plik PROP zawierający listę nazw następujących własności:

    host,
    port,
    initial barrier,
    start barrier,
    final barrier,
    number of shared objects,
    number of clients,
    module 1
    module 2
    
  2. Za pomocą komendy tr wyświetl zawartość PROP bez znaków interpunkcyjnych

  3. Wyświetl zawartość PROP jak powyżej, następnie zamień wszystkie spacje na podkreślniki

  4. Wyświetl zawartość PROP jak powyżej, następnie zamień wszystkie małe litery na wielkie i zapisz wynik do pliku PROP_GEN

cut

wycinanie pól (słów) z rekordu (linii)

-d, --delimiter
 separator pól
-f, --fields pola do wyświetlenia
-c, --characters
 znaku do wyświetlania
--complement wyświetl wszystkie pola które nie zostały wskazane (dopełnienie)

Zadania:

  1. Utwórz plik students zawierający listę studentów (uwaga na spacje):

    Imię     Nazwisko        Indeks    Oceny
    Adam     Rymski          71711     4    5    3
    Tomasz   Filipiuk        71745     4    4
    Karol    Effimenko       101023    4    3
    Anna     Nowak           71791     3.5  5    5    5
    Michał   Korsakow        71921     3.5  3.5  3
    Henryk   Wojciechowski   71710     3    3    2
    Michał   Cierń           71717     4.5  4    5
    Marcin   Kozak           71729     4    4.5  4.5
    Ewa      Tomaszewska     71733     4    4.5  5
    
  2. Używając komendy cut wypisz tylko nazwiska studentów (przydatna może być komenda tr)

  3. Używając komendy cut wypisz tylko imiona i nazwiska studentów bez nagłówka (head/tail)

  4. Używając komendy cut wypisz tylko numery indeksów i oceny studentów

sort

sortowanie liniami

-r, --reverse odwróć kolejność
-n, --numeric-sort
 sortowanie wg wartości liczbowych
-f, --ignore-case
 nie zważaj na wielkośc znaków
-R, --random-sort
 sortowanie wg wartości losowych
-k, --key=KEY sortuj wg pola (definicja KEY w podręczniku)
uniq

usuń powtarzające się linie, działa na posortowanych danych (unique)

-c, --count policz powtarzające się linie

Zadania:

  1. Wyświetl nazwiska studentów z pliku students w kolejności alfabetycznej za pomocą sort, tr, tail/head, cut
  2. Wyświetl indeksy studentów z pliku students w kolejności rosnącej
  3. Wyświetl indeksy studentów z pliku students w kolejności malejącej
  4. Wylosuj nazwisko jednego studenta z pliku students
xargs

przekieruj strumień na argumenty do komendy

xargs echo – wszystko co zostanie wpisane na strumień wejściowy
zostanie przekazane do komendy echo jako argumenty
-i, --replace=STRING
 wstaw każdy z argumentów za wskazany STRING, np. xargs -i\{\} echo "Hello, \{\}. Did you miss me?"
-0, --null przyjmij, że obiekty w strumieniu wejściowym są rozdzielone znakiem \0 zamiast \n (patrz np: find)

Zadania:

  1. Utwórz plik addr z adresami stron internetowych:

    http://www.example.com/
    http://www.cs.put.poznan.pl/ksiek/
    http://www.google.com/
    
  2. Otwórz wszystkie strony zapisane w pliku addr za pomocą dowolnej przeglądaki (xargs)

wc

liczenie znaków/słów/linii (word count)

-c licz tylko znaki
-w licz tylko słowa
-l licz tylko linie

Zadania:

  1. Policz znaki, słowa i linie w znajdujące się w pliku PLIK2

  2. Policz słowa znajdujące się w pliku PLIK2

  3. Policz litery t znajdujące się w pliku students (tr)

tee

wypisz otrzymany strumień do strumienia wyjsciowego, a także do wskazanych plików

-a, --append dopisz zamiast nadpisywać

grep

konfigurowalny filtr - przepuszcza z stdin do stdout linie które pasują do zadanego wzorca (global / regular expression / print)

grep ala - przepuść linie które zawierają napis ala

-i, --ignore-case
 nie zważaj na wielkość liter
-v, --invert match
 przepuść tylko linie które nie pasują do wzorca (dopełnienie)
-e, --regexp=PATTERN
 zastosuj wyrażenie regularne do filtrowania
Wyrażenia regularne w pigułce:
  • ^ – początek linii

  • $ – koniec linii

  • . – dowolny znak

  • X? – (jakikolwiek) znak X wystąpi opcjonalnie

  • X* – (jakikolwiek) znak X może wystąpić dowolną liczbę razy (w tym

    wcale)

  • \X – escape znaku X

  • [X] – klasa znaków X, np:
    • [a-z] – jakikolwiek znak ze zbioru a-z
    • [a-zA-Z0-9] – jakakolwiek litera lub cyfra
    • [., ] – spacja, przecinek lub kropka
  • [^X] – klasa znaków komplementarna do X

Przykłady:
  • ^.$ – linia składająca sie tylko z jednego dowolnego znaku

  • ^mm*$ – linia składająca się z wyłącznie z przynajmniej jednej

    litery m

  • ^\t\. – linia rozpoczynająca sie od tabulatora po którym występuje

    znak .

Ankieta SOP

Ankieta RSOCR

Zadania:

  1. Utwórz plik students zawierający listę studentów (uwaga na spacje):

    Imię     Nazwisko        Indeks    Oceny
    Adam     Rymski          71711     4    5    3
    Tomasz   Filipiuk        71745     4    4
    Karol    Effimenko       101023    4    3
    Anna     Nowak           71791     3.5  5    5    5
    Michał   Korsakow        71921     3.5  3.5  3
    Henryk   Wojciechowski   71710     3    3    2
    Michał   Cierń           71717     4.5  4    5
    Marcin   Kozak           71729     4    4.5  4.5
    Ewa      Tomaszewska     71733     4    4.5  5
    
  2. Za pomocą grep wyświetl wszystkich studentów którzy uzyskali ocenę 2

  3. Wyświetl studentów którzy nie uzyskali żadnej oceny 2

  4. Wyświetl studentów których imiona zaczynają się na M

  5. Wyświetl studentów których imiona zaczynają się na M lub A

  6. Wyświetl studentów których nazwiska zaczynają się na literę z pierwszej połowy alfabetu

  7. Wyświetl studentów których nazwiska nie zawierają litery k

  8. Wyświetl studentów których numer indeksu jest sześciocyfrowy

  9. Wyświetl studentów którzy uzyskali ocenę 5 jako ostatnią

  10. Wyświetl studentów którzy uzyskali ocenę 5 jako przedostatnią

  11. Wyświetl studentów którzy uzyskali ocenę przynajmniej jedną 3 i mają na imię Michał

bc

kalkulator przyjmujący dane ze standardowego wejścia (basic calculator)

echo 2 + 2 | bc

bc jest kalkulatorem arbitrary precision, więc można (trzeba) zdefiniować ile miejsc po przecinku nas interesuje

echo "scale=2; 6.0 / 4.0" | bc

Zadanie dla odważnych:

  1. Zsumuj oceny uzyskane przez wszystkich studentów w pliku students (bc, cut, tr, head/tail, xargs, echo)