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):
- standardowe wejście (stdin)
- standardowe wyjście (stdout)
- wyjście błędów (stderr)
- ...
Przekierowanie strumieni do plików¶
KOMENDA 1> PLIK
lubKOMENDA > PLIK
- przekieruj stdout procesu na początek pliku
PLIK
(więc plik zostanie nadpisany) KOMENDA 2> PLIK
- to samo dla stderr
KOMENDA 1>> PLIK
lubKOMENDA >> 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órzPLIK
, podaj zawartość do komendyless
(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:
- Uruchom komendę
firefox
(lubchromium
lubopera
) w terminalu - Uruchom tą samą komendę przekierowując jej stdout i stderr do czarnej dziury
- Uruchom komendę
find /
z przekierowaniem tak, żeby nie wypisywała błędów na konsolę - 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:
Utwórz plik
PLIK1
o zawartościhello world
za pomocą komendyecho
.Dopisz komendą
echo
na koniec plikuPLIK1
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:
Uruchom komendy
cat
bez argumentów i wpisz kilka linii (zakończ znakiem końca strumienia)Za pomocą komendy
cat
utwórz plikPLIK2
o treści:We are using Linux daily to UP our productivity. So UP yours! -- Adapted from Pat Paulsen by Joe Sloan
Za pomocą komendy
cat
skopiuj zawartość plikuPLIK2
doPLIK3
Za pomocą komendy
cat
połącz zawartość plikówPLIK2
iPLIK1
i zapisz ją do plikuPLIK3
Wyświetl zawartośc pliku
PLIK3
z ponmumerowanymi liniami
tac
cat
od tyłu
Zadania:
- Uruchom komendy
tac
bez argumentów i wpisz kilka linii - Za pomocą komendy
tac
skopiuj zawartość plikuPLIK2
doPLIK4
- Wyświetl zawartośc pliku
PLIK2
za pomocą komendytac
- Wyświetl zawartośc pliku
PLIK2
za pomocą komendtac
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:
- Za pomocą komendy
ls
utwórz plikPLIK5
którego zawartość to lista plików i katalogów w katalogudev
- Wyświetl zawartość pliku
PLIK5
ze stronnicowaniem za pomocąmore
- Wyświetl zawartość pliku
PLIK5
z przewijaniem za pomocąless
- Wyświetl zawartość katalogu
/dev
ze stronnicowaniem za pomocąmore
(bez używania dodatkowych plików) - Wyświetl zawartość katalogu
/dev
z przewijaniem za pomocąless
(bez używania dodatkowych plików) - 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 ostatnichtail
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:
- Odczytaj zawartość pliku
PLIK5
numerując linie (cat
) i wyświetl tylko pierwsze 10 linii (head
) - Odczytaj zawartość pliku
PLIK5
numerując linie (cat
) i wyświetl tylko pierwszą linię (head
) - Odczytaj zawartość pliku
PLIK5
numerując linie (cat
) i wyświetl tylko ostatnie 10 linii (tail
) - Odczytaj zawartość pliku
PLIK5
numerując linie (cat
) i wyświetl tylko ostatnią linię (tail
) - Odczytaj zawartość pliku
PLIK5
numerując linie (cat
) i wyświetl tylko 5 linię (head
itail
)
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 literya
na kropki, wszystkie literyb
na znaki zapytaniatr -d a
– usuń wszystkie znakia
tr -cd a
– usuń wszystkie znaki inne niża
tr -s ' '
– usuń wszystkie powtarzające się spacje
Zadania:
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
Za pomocą komendy
tr
wyświetl zawartośćPROP
bez znaków interpunkcyjnychWyświetl zawartość
PROP
jak powyżej, następnie zamień wszystkie spacje na podkreślnikiWyświetl zawartość
PROP
jak powyżej, następnie zamień wszystkie małe litery na wielkie i zapisz wynik do plikuPROP_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:
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
Używając komendy
cut
wypisz tylko nazwiska studentów (przydatna może być komendatr
)Używając komendy
cut
wypisz tylko imiona i nazwiska studentów bez nagłówka (head
/tail
)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:
- Wyświetl nazwiska studentów z pliku
students
w kolejności alfabetycznej za pomocąsort
,tr
,tail
/head
,cut
- Wyświetl indeksy studentów z pliku
students
w kolejności rosnącej - Wyświetl indeksy studentów z pliku
students
w kolejności malejącej - 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:
Utwórz plik
addr
z adresami stron internetowych:http://www.example.com/ http://www.cs.put.poznan.pl/ksiek/ http://www.google.com/
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:
Policz znaki, słowa i linie w znajdujące się w pliku
PLIK2
Policz słowa znajdujące się w pliku
PLIK2
Policz litery
t
znajdujące się w plikustudents
(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 znakX?
– (jakikolwiek) znak X wystąpi opcjonalnieX*
– (jakikolwiek) znak X może wystąpić dowolną liczbę razy (w tymwcale)
\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 jednejlitery m
^\t\.
– linia rozpoczynająca sie od tabulatora po którym występujeznak .
Zadania:
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
Za pomocą
grep
wyświetl wszystkich studentów którzy uzyskali ocenę2
Wyświetl studentów którzy nie uzyskali żadnej oceny
2
Wyświetl studentów których imiona zaczynają się na
M
Wyświetl studentów których imiona zaczynają się na
M
lubA
Wyświetl studentów których nazwiska zaczynają się na literę z pierwszej połowy alfabetu
Wyświetl studentów których nazwiska nie zawierają litery
k
Wyświetl studentów których numer indeksu jest sześciocyfrowy
Wyświetl studentów którzy uzyskali ocenę
5
jako ostatniąWyświetl studentów którzy uzyskali ocenę
5
jako przedostatnią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 interesujeecho "scale=2; 6.0 / 4.0" | bc
Zadanie dla odważnych:
- Zsumuj oceny uzyskane przez wszystkich studentów w pliku
students
(bc
,cut
,tr
,head
/tail
,xargs
,echo
)