Linux Strumienie i potoki

Transkrypt

Linux Strumienie i potoki
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