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)
…
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
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
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
(lub chromium
lub opera
) 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
Potoki pozwalają łączyć komendy ad hoc w skomplikowane narzędzia do przetwarzania tekstu.
echo
wyświetl napis (podany przez argumenty)
interpretuj znaki specjalne (lista znaków specjalnych w podręczniku)
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ści hello world
za pomocą komendy
echo
.
Dopisz komendą echo
na koniec pliku PLIK1
tekst:
linii: 1
słów: 2
znaków: 12
cat
konkatenacja plików (catenate)
cat FILE
wypisanie zawartości pliku
cat FILE1 FILE2
wypisanie skonkatenowanej zawartości pliku
ponumeruj linie
ponumeruj niepuste linie
pomiń puste linie
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 plik PLIK2
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ść pliku PLIK2
do
PLIK3
Za pomocą komendy cat
połącz zawartość plików PLIK2
i PLIK1
i
zapisz ją do pliku PLIK3
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ść pliku PLIK2
do PLIK4
Wyświetl zawartośc pliku PLIK2
za pomocą komendy tac
Wyświetl zawartośc pliku PLIK2
za pomocą komend tac
tak, żeby
kolejność linii nie była odwrócona
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 plik PLIK5
którego zawartość to lista
plików i katalogów w katalogu dev
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)
head
czyta początek pliku (strumienia) - domyślnie 10 linii
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
czytaj K ostatnich linii; jeśli K zaczyna się od
znaku +
, czytaj wszystkie linie pliku oprócz K
pierwszych
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
i tail
)
tr
tłumaczenie znaków (na inne znaki) (translate)
zamiast tłumaczyć, usuń powtórzenia
zamiast tłumaczyć, usuń znaki
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:
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
interpunkcyjnych
Wyświetl zawartość PROP
jak powyżej, następnie zamień wszystkie spacje
na podkreślniki
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)
separator pól
pola do wyświetlenia
znaku do wyświetlania
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ć
komenda tr
)
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
odwróć kolejność
sortowanie wg wartości liczbowych
nie zważaj na wielkośc znaków
sortowanie wg wartości losowych
sortuj wg pola (definicja KEY
w podręczniku)
uniq
usuń powtarzające się linie, działa na posortowanych danych (unique)
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ściowyzostanie przekazane do komendy echo jako argumenty
wstaw każdy z argumentów za wskazany STRING, np.
xargs -I"\{\}" echo "Hello, \{\}. Did you miss me?"
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)
licz tylko znaki
licz tylko słowa
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 pliku students
(tr
)
tee
wypisz otrzymany strumień do strumienia wyjsciowego, a także do wskazanych plików
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
^
– 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 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
^.$
– 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
lub A
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 interesuje
echo "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
)