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