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> PLIKlubKOMENDA > PLIK- przekieruj stdout procesu na początek pliku
PLIK(więc plik zostanie nadpisany) KOMENDA 2> PLIK- to samo dla stderr
KOMENDA 1>> PLIKlubKOMENDA >> 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 < PLIKlub< PLIK KOMENDA- otwórz plik
PLIKi 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(lubchromiumlubopera) 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¶
echowyś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 worldecho "hello\nworld"echo -e "hello\nworld"
Zadania:
Utwórz plik
PLIK1o zawartościhello worldza pomocą komendyecho.Dopisz komendą
echona koniec plikuPLIK1tekst:linii: 1 słów: 2 znaków: 12
Łączenie plików¶
catkonkatenacja 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
catbez argumentów i wpisz kilka linii (zakończ znakiem końca strumienia)Za pomocą komendy
catutwórz plikPLIK2o treści:We are using Linux daily to UP our productivity. So UP yours! -- Adapted from Pat Paulsen by Joe SloanZa pomocą komendy
catskopiuj zawartość plikuPLIK2doPLIK3Za pomocą komendy
catpołącz zawartość plikówPLIK2iPLIK1i zapisz ją do plikuPLIK3Wyświetl zawartośc pliku
PLIK3z ponmumerowanymi liniami
tac
catod tyłu
Zadania:
- Uruchom komendy
tacbez argumentów i wpisz kilka linii - Za pomocą komendy
tacskopiuj zawartość plikuPLIK2doPLIK4 - Wyświetl zawartośc pliku
PLIK2za pomocą komendytac - Wyświetl zawartośc pliku
PLIK2za pomocą komendtactak, ż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
lsutwórz plikPLIK5którego zawartość to lista plików i katalogów w katalogudev - Wyświetl zawartość pliku
PLIK5ze stronnicowaniem za pomocąmore - Wyświetl zawartość pliku
PLIK5z przewijaniem za pomocąless - Wyświetl zawartość katalogu
/devze stronnicowaniem za pomocąmore(bez używania dodatkowych plików) - Wyświetl zawartość katalogu
/devz przewijaniem za pomocąless(bez używania dodatkowych plików) - Wyświetl zawartość katalogu
/dev, odwróć kolejność listy wyników i pozwól
headczyta 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 ostatnichtailczyta 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
PLIK5numerując linie (cat) i wyświetl tylko pierwsze 10 linii (head) - Odczytaj zawartość pliku
PLIK5numerując linie (cat) i wyświetl tylko pierwszą linię (head) - Odczytaj zawartość pliku
PLIK5numerując linie (cat) i wyświetl tylko ostatnie 10 linii (tail) - Odczytaj zawartość pliku
PLIK5numerując linie (cat) i wyświetl tylko ostatnią linię (tail) - Odczytaj zawartość pliku
PLIK5numerując linie (cat) i wyświetl tylko 5 linię (headitail)
trtł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 literyana kropki, wszystkie literybna znaki zapytaniatr -d a– usuń wszystkie znakiatr -cd a– usuń wszystkie znaki inne niżatr -s ' '– usuń wszystkie powtarzające się spacje
Zadania:
Utwórz plik
PROPzawierają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
trwyświetl zawartośćPROPbez znaków interpunkcyjnychWyświetl zawartość
PROPjak powyżej, następnie zamień wszystkie spacje na podkreślnikiWyświetl zawartość
PROPjak powyżej, następnie zamień wszystkie małe litery na wielkie i zapisz wynik do plikuPROP_GEN
cutwycinanie 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
studentszawierają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
cutwypisz tylko nazwiska studentów (przydatna może być komendatr)Używając komendy
cutwypisz tylko imiona i nazwiska studentów bez nagłówka (head/tail)Używając komendy
cutwypisz tylko numery indeksów i oceny studentów
sortsortowanie 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 KEYw podręczniku)uniqusuń 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
studentsw kolejności alfabetycznej za pomocąsort,tr,tail/head,cut - Wyświetl indeksy studentów z pliku
studentsw kolejności rosnącej - Wyświetl indeksy studentów z pliku
studentsw kolejności malejącej - Wylosuj nazwisko jednego studenta z pliku
students
xargsprzekieruj 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
addrz 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
addrza pomocą dowolnej przeglądaki (xargs)
wcliczenie 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
PLIK2Policz słowa znajdujące się w pliku
PLIK2Policz litery
tznajdujące się w plikustudents(tr)
teewypisz 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
studentszawierają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ą
grepwyświetl wszystkich studentów którzy uzyskali ocenę2Wyświetl studentów którzy nie uzyskali żadnej oceny
2Wyświetl studentów których imiona zaczynają się na
MWyświetl studentów których imiona zaczynają się na
MlubAWyś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
kWyświetl studentów których numer indeksu jest sześciocyfrowy
Wyświetl studentów którzy uzyskali ocenę
5jako ostatniąWyświetl studentów którzy uzyskali ocenę
5jako przedostatniąWyświetl studentów którzy uzyskali ocenę przynajmniej jedną
3i mają na imięMichał
bckalkulator przyjmujący dane ze standardowego wejścia (basic calculator)
echo 2 + 2 | bcbcjest 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)