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