Przekierowywanie strumieni, potoki Standardowe strumienie we/wy

Transkrypt

Przekierowywanie strumieni, potoki Standardowe strumienie we/wy
Przekierowywanie strumieni, potoki
Standardowe strumienie we/wy:
0 wejście, stdin
1 wyjście, stdout
2 blędy, null ("czrna dziura")
Wejście oznacza się jako "<", wyjście z kolei symbolem: ">".
Wynik polecenia "cat" zapiszujemy do pliku "pliczek":
$ cat > wyjscie
jakis tekst
możesz wprowadzać wiele linii
możesz używać polskich znaków: ąęćź oraz &^!%#@ ^@*$&*)(@*)!{}:":
dopoki nie naciśnesz kombinacji [CTRL]+[d] aby zakończyć
Można łączyć symbole we/wy w jednym poleceniu.
$ cat < wyjscie > kopia_wyjscia
Standardowe wyjście błędów
# cat < nieistniejacy_plik > kopia
bash: nieistniejacy_plik: Nie ma takiego pliku ani katalogu
Linux (podobnie jak większość SO) odróżnia dwa wyjścia: standardowe wyjście oraz standardowe wyjście błędów oznaczane symbolem "2>".
# find / -Qname "qwq" -print > wyniki_szukania 2> bledy &
-Qname zamiast -name --->, BŁĄD
$ cat bledy
find: invalid predicate `-Qname'
Można zrobić jeszcze jedną "sztuczkę". Błędy i wyniki są zapisywane do jednego pliku (i tak się zazwyczaj robi, aby
wiedzieć kiedy wystąpił błąd - łatwiej będzie taki błąd zlokalizować i poprawić). Używa się wtedy "&>" aby poinformować
powłokę, że standardowe wyjście oraz wyjście błędów mają być przekierowane do tego samego pliku.
$ find / -Qname "xyz" -print &> wyniki_szukania &
Operatory ">>" oraz "<<"
Pierwszy operator jest operatorem dołączenia. Możemy tak połączyć w jeden dokument kilka plików. Np. dopiszmy pliki:
"bledy_pn", "bledy_wt", "bledy_sr" do pliku "bledy".
$ cat < bledy_pn > bledy
$ cat < bledy_wt >> bledy
$ cat < bledy_sr >> bledy
Pierwszy poleceniem "cat" stworzyłem plik "bledy", potem już tylko dopisywałem do niego.
Operator "<<" jest tez nazywany operatorem "here". Powoduje on wczytywanie do pliku danych dopóki nie wpiszemy
wzorca kończącego, który jest argumentem operatora.
np.:
$ cat << $koniec$ > moj_tekst.txt
> sjdcsgfdhsgfdg
> dsvjgfdgvfd
> djhgffhgvjfdhgs
> i tak dalej ;D
> $koniec$
Jeśli wyświetlimy teraz zawartość pliku moj_tekst.txt otrzymamy:
$ cat moj*
sjdcsgfdhsgfdg
dsvjgfdgvfd
djhgffhgvjfdhgs
i tak dalej ;D
Czyli bez napisu $koniec$ - ponieważ był to wzorzec końca wprowadzanego tekstu.
Potoki
Potoki to nic innego jak przekierowania wyjścia strumieni z jednej aplikacji (polecenia, urządzenia) na wejście drugiej.
Znak potoku to: "|".
Polecenie "users" wyświetla listę aktualnie zalogowanych do systemu użytkowników. Aby policzyć tych użytkowników
możemy użyć polecenia "wc -w", które policzy słowa zwracane przez pierwsze polecenie. Możemy dopisać kilka
pożytecznych linii do pliku ".bash_profile":
kto=`users`
ile=`users | wc -w`
echo "Obecnie w systemie jest: $ile uzytkownikow, oto oni:"
echo $kto
I teraz po każdym zalogowaniu się do systemu będziesz otrzymywał komunikat o zalogowanych użytkownikach - ich liczbę
oraz listę.
find
Find - szukanie plików w systemie Linux
Podstawowa składania to:
# find katalog -name wzorzec [inne opcje] -print
Poszukemy pliku o wzorcu "abc*" i chcemy przeszukać cały system:
# find / -name "abc*" -print
Wyszukanie wszystkich plików, które nie pasujących do wzorca "abc*". (negacja opcji)
# find / ! -name "abc*" -print
Find może uwględniać kilka wybranych warunków.
# find / -name "abc*" -size +10c -mtime 3 -print
"Znajdź pliki o nazwie pasującej do "abc*" i o rozmiarach >= 10 bajtów i modyfikowanych trzy dni temu"
Alternatywa do warunków, wprowadzana jest w maskowanych nawiasach a pomiędzy dwoma warunkami wstawiamy -o(lub
-or), schemat:
find katalog \( opcja1 -o opcja2 -o ... -o opcjan \) -print
Można zagnieżdżać warunki!
# find / \( -name "abc*" -o -name "comm*" -o -name "au*" \) -o \( -size +1000c -mtime 2 \)
-print
Alternatywa dwóch warunków: pierwszy to alternatywa plików pasujących do trzech wzorców nazw, drugi warunek do
koniunkcja warunku >= 1000 bajtów oraz ostatniej modyfikacji dwa dni temu.