Linux
Strumienie i potoki
Opracował: Arkadiusz Curulak
WSIiE TWP w Olsztynie
Data aktualizacji : 14-01-2003
Pierwsza edycja : 14-01-2003
Spis treści
Strumienie .....................................................................................................................2
Przekierowanie standardowego wyjścia (operator >) ..........................................2
Dołączanie standardowego wyjścia do istniejącego pliku (operator >>) ............3
Przekierowanie standardowego wejścia (operator <) ..........................................4
Łączenie operacji przekierowań ..........................................................................4
Potoki ............................................................................................................................5
Literatura .......................................................................................................................6
Linux: Strumienie i potoki
2
Strumienie
Zanim przejdziemy do omówienia strumieni, wprowadzimy dwa pojęcia, do których odnosi się ten temat:
• standardowe wyjście
• standardowe wejście
Dane generowane przez polecenia (np. who czy ls) umieszczane są w strumieniu danych standardowego wyjścia. Domyślnym przeznaczeniem dla takiego strumienia jest ekran monitora.
Standardowe wejście zapewnia odbieranie danych pochodzących z urządzeń czy plików. W tym przypadku, domyślnym źródłem strumienia danych jest klawiatura.
Zatem, wejściowy strumień danych nazywać będziemy standardowym wejściem, natomiast wyjściowy strumień danych standardowym wyjściem.
Standardowe wejście i wyjście (strumienie danych) możemy przekierowywać.
Do tego celu przygotowano trzy operatory:
Operator
Przeznaczenie
>
przekierowanie standardowego wyjścia
>>
dołączanie standardowego wyjścia (do istniejącego pliku)
<
przekierowanie standardowego wejścia
Warto jeszcze wspomnieć o tym, że zarówno ekran (konsola wyjścia), jak i klawiatura (konsola wejścia), traktowane są w Linuxie jako pliki.
Przekierowanie standardowego wyjścia (operator >)
Przekierowanie standardowego wyjścia omówimy na podstawie kilku przykładów.
Przykład 1
Przekierowanie danych pochodzących z polecenia who do pliku.
Standardowo who drukuje listę zalogowanych użytkowników na ekranie: arek@hercules:~$ who
gracjan pts/1 Jan 14 09:22
arek pts/0 Jan 14 09:23
apolonia pts/2 Jan 14 09:25
Chcąc zapisać taką listę do pliku kto_zalogowany musimy wydać polecenie: who > kto_zalogowany
W tej sytuacji w katalogu bieżącym zostanie utworzony plik kto_zalogowany z listą zalogowanych użytkowników.
Linux: Strumienie i potoki
3
Przykład 2
Utworzenie kopii pliku. Wykorzystamy polecenie cat, którego standardowe wyjście (ekran) przekierujemy do pliku kopia_osoby.
cat osoby > kopia_osoby
Wydanie tego polecenia utworzy kopię pliku osoby (to co cat wydrukowałby na ekranie powędruje do pliku kopia_osoby).
Przykład 3
Tworzenie nowego pliku tekstowego z jednoczesnym wpisaniem do niego danych.
cat > studenci
Wydanie powyższego polecenia spowoduje, że standardowe wyjście (ekran) przekierujemy do pliku studenci. Po zatwierdzeniu tego polecenia Enterem, kursor ustawi się w wierszu poniżej. Teraz będziemy mogli wprowadzać dane, zatwierdzając Enterem kolejno wpisywane wiersze. Wprowadzanie danych będzie trwało do momentu wprowadzenia znaku końca pliku CTRL+D (^D).
arek@hercules:~$ cat > studenci
Kowalski Jan
Nowak Apolonia
Mewa Joanna
Adamski Piotr
Walach Anna
Nowicki Adam
^D
Dołączanie standardowego wyjścia do istniejącego pliku (operator >>) Standardowe wyjście możemy również dołączać do już istniejącego pliku za pomocą operatora >>.
Przykład 4
Polecenie date pokaże nam na ekranie bieżący czas i datę.
arek@hercules:~$ date
Thu Jan 14 09:57:29 CET 2003
Wydając polecenie:
date > data_czas
przekierujemy informacje o dacie i czasie do pliku data_czas.
Wydanie tego samego polecenia po pewnym czasie ponownie wpisze do pliku data_czas informacje o dacie i czasie, przy czym poprzednie dane zostaną usunięte (nastąpi nadpisanie pliku data_czas).
Jeżeli chcemy, aby dotychczasowe wpisy pozostały, zamiast operatora > powinniśmy użyć operatora >>. Teraz nowe dane będą dopisywane na końcu pliku, nie niszcząc danych istniejących w tym pliku.
Linux: Strumienie i potoki
4
date >> data_czas
Jeżeli plik, do którego chcemy dopisać dane, nie istnieje, wtedy pierwsze wywołanie polecenia z użytym operatorem >> utworzy go.
Przykład 5
Do pliku utworzonego w przykładzie 3 dopiszemy jeszcze jedną osobę (nie usuwając osób już tam wpisanych).
echo "Naparstek Anna" >> studenci
Teraz na liście studentów mamy siedem osób.
Przekierowanie standardowego wejścia (operator <)
Standardowe wejście (poza klawiaturą) może być również odbierane z pliku.
Standardowym wejściem dla polecenia cat jest klawiatura. Jeżeli wydamy polecenie cat, będzie ono odbierało wiersz danych ze standardowego wejścia i od razu go wyświetlało. Operację wprowadzania danych zakończymy wprowadzając znak końca pliku (^D).
arek@hercules:~$ cat
Ala ma kota
Ala ma kota
Kot jest puszysty
Kot jest puszysty
^D
Przykład 6
Standardowe wejście dla polecenia cat przekierujemy tak, aby odbierane było z pliku (a nie z klawiatury):
cat < studenci
W efekcie na ekranie zobaczymy zawartość pliku studenci.
Łączenie operacji przekierowań
Możemy łączyć operacje przekierowań standardowego wejścia i wyjścia.
Przykład 7
Zawartość pliku studenci posortujemy, a następnie wynik sortowania umieścimy w pliku studenci_alfabetycznie.
sort < studenci > stydenci_alfabetycznie
Linux: Strumienie i potoki
5
Potoki
W sytuacji, gdy musimy przesłać dane pochodzące z jednego programu do programu drugiego, rozwiązaniem jest skorzystanie z potoków.
Operatorem wykorzystywanym do budowania potoków jest | (pionowa kreska występująca na klawiaturze razem z backslashem). Operacja potoku odbiera wynik polecenia umieszczonego przed operatorem potoku i wysyła je jako dane wejściowe do polecenia umieszczonego za operatorem potoku.
Przykład 8
Wydanie polecenia ls –l /etc wyświetla zawartość katalogu /etc, przy czym przyjmijmy, że wydruk nie mieści się na jednym ekranie (liczba plików i katalogów jest bardzo duża). Aby postronicować wydruk użyjemy polecenia more.
ls –l /etc | more
Przykład 9
Wyświetlmy wszystkich studentów, których nazwisko zaczyna się na literę N.
cat studenci | grep ^N
Strumień danych pochodzący z polecenia cat studenci będzie strumieniem wejściowym dla polecenia grep. Na ekranie zobaczymy:
Nowak Apolonia
Nowicki Adam
Naparstek Anna
Jeżeli chcemy, aby poza wydrukowaniem wyniku na ekranie, powędrował on również do pliku osoby_na_n, musimy wydać polecenie:
cat studenci | grep ^N | tee osoby_na_n
Polecenie tee kopiuje standardowe wyjście do pliku.
Możemy też przekierować strumień danych wyłącznie do pliku za pomocą operatora przekierowania standardowego wyjścia:
cat studenci | grep ^N > osoby_na_n
Jak widać łączenie potoków i przekierowania strumieni jest dopuszczalne.
Przykład 10
Rozszerzymy nieco zadanie z przykładu 9.
Poza utworzeniem listy studentów z nazwiskami na N i zapisaniem tej listy do pliku osoby_na_n, chcemy dodatkowo, aby na ekranie wyświetliła się liczba kobiet (zakładając, że imię kobiece kończy się na a):
cat studenci | grep ^N | tee osoby_na_n | grep a$ | wc -l
Linux: Strumienie i potoki
6
W wyniku tego ładniutkiego potoku, otrzymamy plik osoby_na_n (z trzema studentami) oraz wyświetloną liczbę 2 na ekranie.
Dodam tylko, że polecenie wc –l podaje liczbę wierszy wejściowego strumienia danych.
Literatura
[1] Petersen R., „Arkana Linux”, Wydawnictwo RM, Warszawa 1997
[2] Parker T., „Linux. Księga eksperta”, Helion, Gliwice 1999
[3] Friedl J., „Wrażenia regularne”, Helion, Gliwice 2001