3.2 Lekcja 1
Certifikat: |
Linux Essentials |
---|---|
Wersja: |
1.6 |
Temat: |
3 Siła wiersza poleceń |
Cel nauki: |
3.2 Wyszukiwanie i wyodrębnianie danych z plików |
Lekcja: |
1 z 2 |
Wstęp
W tej lekcji skupimy się na przekierowaniu lub przekazywaniu informacji z jednego źródła do drugiego za pomocą określonych narzędzi. Linia poleceń Linuxa przekierowuje informacje przez określone standardowe kanały. Standardowe wejście polecenia (stdin standard input lub kanał 0) jest uważane za klawiaturę, a standardowe wyjście (stdout standard output lub kanał 1) jest uważane za ekran monitora. Istnieje również inny kanał, który jest przeznaczony do przekierowywania wyjścia błędów polecenia (stderr standard error lub kanał 2) lub komunikatów o błędach programu. Każde wejście i / lub wyjście w systemie Linux może być przekierowane.
Czasami, gdy uruchamiamy polecenie, chcemy wysłać określone informacje do polecenia lub przekierować dane wyjściowe do określonego pliku. Każda z tych funkcjonalności zostanie omówiona w następnych dwóch sekcjach.
Przekierowanie I/O
Przekierowanie wejścia / wyjścia umożliwia użytkownikowi przekierowanie informacji z lub do polecenia przy użyciu pliku tekstowego. Jak opisano wcześniej, standardowe wejście, wyjście i wyjście błędów może zostać przekierowane, a informacje można pobrać z plików tekstowych.
Przekierowywanie standardowego wyjścia (Standard Output)
Aby przekierować standardowe wyjście do pliku zamiast na ekran, musimy użyć operatora >
, po którym następuje nazwa pliku. Jeśli plik nie istnieje, zostanie utworzony nowy plik, w przeciwnym wypadku informacje zastąpią istniejący plik.
Aby zobaczyć zawartość właśnie utworzonego pliku, możemy użyć polecenia cat
, które domyślnie wyświetla zawartość pliku na ekranie. Możesz dowiedzieć się więcej o jego funkcjach na stronie podręcznika.
Poniższy przykład przedstawia funkcjonalność operatora. W pierwszej kolejności tworzony jest nowy plik zawierający tekst “Hello World!”:
$ echo "Hello World!" > text $ cat text Hello World!
Przy drugim wywołaniu ten sam plik jest zastępowany przez nowy tekst:
$ echo "Hello!" > text $ cat text Hello!
Jeśli chcemy dodać nowe informacje na końcu pliku, musimy użyć operatora >>
, który również tworzy nowy plik, jeśli nie może znaleźć istniejącego.
Pierwszy przykład pokazuje dodanie tekstu. Jak widać, nowy tekst został dodany w nowym wierszu:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Drugi przykład pokazuje, że zostanie utworzony nowy plik:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Przekierowanie błędu standardowego (Standard Error)
Aby przekierować tylko komunikaty o błędach, użytkownik będzie musiał użyć operatora 2>
, po którym następuje nazwa pliku, do którego mają zostać zapisane błędy. Jeśli plik nie istnieje, zostanie utworzony nowy plik, w przeciwnym razie plik zostanie nadpisany.
Jak już wyjaśniono, kanałem przekierowania standardowego wyjścia błędów jest kanał 2. Podczas przekierowywania standardowego wyjścia błędów należy określić kanał, w przeciwieństwie do innych standardowych wyjść, w których kanał 1 jest ustawiony domyślnie. Na przykład poniższe polecenie wyszukuje pliki lub katalogi o nazwie games
i po prostu zapisuje błąd tylko w pliku tekstowym text-error
, wyświetlając standardowe wyjście na ekranie:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Aby uzyskać więcej informacji na temat polecenia |
Na przykład poniższe polecenie zostanie uruchomione bez błędów, dlatego żadne informacje nie zostaną zapisane w pliku tekstowym text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
Podobnie jak w przypadku standardowego wyjścia, standardowe wyjście błędów można również dołączyć do pliku z operatorem 2>>
. Nowy błąd zostanie dodany na końcu pliku. Jeśli plik nie istnieje, zostanie utworzony nowy. Pierwszy przykład pokazuje dodanie nowych informacji do istniejącego pliku, podczas gdy drugi przykład pokazuje, że polecenie tworzy nowy plik, jeśli nie zostanie znaleziony plik o tej nazwie:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
W przypadku tego typu przekierowania, do pliku przekierowywane są tylko komunikaty o błędach; standardowe wyjście się nie zmienia (stdout) i zostanie wyświetlone na ekranie.
Istnieje pewien plik, który jest technicznie koszem na śmieci (bit bucket). Plik ten przyjmuje dane wejściowe, ale nic z nim nie robi, a jego ściezka to: /dev/null
. Możesz tam przekierować wszelkie nieistotne informacje, których nie chcesz wyświetlać ani zapisywać do pliku, jak pokazano w poniższym przykładzie:
$ sort /etc 2> /dev/null
Przekierowywanie standardowego wejścia (Standard Input)
Ten typ przekierowania służy do wprowadzania danych do polecenia z określonego pliku zamiast korzystania z klawiatury. Odbywa się to za pomocą operatora <
, jak widać w poniższym przykładzie:
$ cat < text Hello! Hello to you too!
Przekierowywanie standardowego wejścia jest zwykle używane z poleceniami, które nie przyjmują argumentów plikowych. Polecenie tr
jest jednym z nich. Służy ono do tłumaczenia zawartości pliku poprzez modyfikację znaków w pliku w określony sposób, na przykład poprzez usunięcie określonego znaku z pliku. Poniższy przykład pokazuje, jak usunąć znak l
:
$ tr -d "l" < text Heo! Heo to you too!
Aby uzyskać więcej informacji, zapoznaj się ze stroną podręcznika tr
.
Here Documents
Operator <<
zachowuje się inaczej niż w przypadku przekierowań wyjściowych. Ten strumień wejściowy jest również nazywany here document. Here document reprezentuje blok kodu lub tekstu, który można przekierować do polecenia lub programu interaktywnego. Różne typy języków skryptowych, takie jak bash
, sh
oraz csh
mogą pobierać dane wejściowe bezpośrednio z wiersza poleceń, bez używania plików tekstowych.
Jak widać na poniższym przykładzie, operator <<
służy do przekazywania danych do polecenia, przy czym następujące słowo nie oznacza nazwy pliku. Słowo to jest raczej interpretowane jako separator danych wejściowych i nie będzie brane pod uwagę jako treść; dlatego polecenie cat
go nie wyświetli:
$ cat << hello > hey > ola > hello hey ola
Więcej informacji można znaleźć na stronie podręcznika man dla komendy cat
.
Kombinacje
Pierwsza kombinacja, którą zbadamy, łączy przekierowanie standardowego wyjścia (Standard Output) i standardowego wyjścia błędów (Standard Output Error) do tego samego pojedynczego pliku. Aby to zrobić, używamy operatorów &>
oraz &>>
, gdzie &
reprezentuje kombinację kanału 1 i kanału 2. Pierwszy operator nadpisze istniejącą zawartość pliku, a drugi doda nowe informacje na końcu istniejącego pliku. Oba operatory umożliwią, podobnie jak w poprzednich sekcjach, na utworzenie nowego pliku, jeżeli jeszcze nie istnieje:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Spójrzmy na przykład z użyciem polecenia cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
Polecenie cut
wycina określone pola z pliku wejściowego przy użyciu opcji -f
, w naszym przypadku jest trzecie pole. Aby polecenie znalazło pole, należy separator również określić za pomocą opcji -d
. W naszym przypadku separatorem będzie znak /
.
Aby dowiedzieć się więcej o poleceniu cut
, zapoznaj się z jego stroną podręcznika systemowego.
Potoki (Pipes)
Przekierowanie jest najczęściej używane do zapisania wyniku jednego polecenia, a następnie do przetworzenia go przez inne polecenie. Te pośrednie procesy mogą stać się bardzo czasochłonne i skomplikowane, jeśli chcesz, aby dane przechodziły przez wiele procesów. Aby tego uniknąć, polecenia można łączyć bezpośrednio za pomocą potoków (pipes). Innymi słowy, dane wyjściowe pierwszego polecenia automatycznie stają się danymi wejściowymi drugiego polecenia. To połączenie jest tworzone za pomocą operatora |
(pionowa linia)
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
W powyższym przykładzie polecenie less
za operatorem potoku (pipe) modyfikuje sposób wyświetlania pliku. Polecenie less
wyświetla plik tekstowy, umożliwiając użytkownikowi przewijanie w górę i w dół po jednym wierszu. Domyślnie less
jest również używany do wyświetlania stron podręcznika man
, tak jak zostało to omówione w poprzednich lekcjach.
Możliwe jest jednoczesne użycie wielu potoków. Polecenia pośrednie, które odbierają dane wejściowe, a następnie je zmieniają i generują dane wyjściowe, nazywane są filtrami (filters). Przykładowo chcemy za pomocą polecenia ls -l
policzyć liczbę słów z pierwszych 10 wierszy wyniku. Aby to zrobić, będziemy musieli użyć polecenia head
, które domyślnie wyświetla pierwsze 10 wierszy pliku, a następnie policzyć słowa za pomocą polecenia wc
:
$ ls -l | head | wc -w 10
Jak wspomniano wcześniej, domyślnie argument head
wyświetla tylko pierwsze 10 wierszy podanego pliku tekstowego. To zachowanie można zmodyfikować za pomocą pewnych opcji. Aby uzyskać więcej informacji, zobacz stronę podręcznika polecenia.
Istnieje również polecenie tail
, które wyświetla koniec pliku. Domyślnie to polecenie wybiera i wyświetla ostatnie 10 wierszy pliku, ale liczbę wyświetlanych wierszy można również modyfikować, podobnie jak w przypadku polecenia head
. Więcej szczegółów znajdziesz na stronie podręcznika tail
.
Note
|
Opcja |
Polecenie wc
(word count, liczba słów) domyślnie zlicza wiersze, słowa i bajty w pliku. Jak pokazano w ćwiczeniu, opcja -w
powoduje, że polecenie liczy tylko słowa w wybranych wierszach. Najczęstszymi opcjami, których można użyć z tym poleceniem, są -l
(licz tylko wiersze) oraz -c
(licz tylko bajty). Dodatkowe opcje polecenia, a także dodatkowe informacje o wc
można znaleźć na stronie podręcznika polecenia.
Guided Exercises
-
Wypisz zawartość bieżącego katalogu, w tym prawa własności i uprawnienia, i przekieruj dane wyjściowe do pliku o nazwie
contents.txt
w Twoim katalogu domowym. -
Posortuj zawartość pliku
contents.txt
z bieżącego katalogu i dołącz go na końcu nowego pliku o nazwiecontents-sorted.txt
. -
Wyświetl ostatnie 10 wierszy pliku
/etc/passwd
i przekieruj je do nowego pliku w kataloguDocuments
Twojego użytkownika. -
Policz liczbę słów w pliku
contents.txt
i dołącz wynik na końcu plikufield2.txt
w swoim katalogu domowym. Będziesz musiał użyć przekierowania zarówno wejścia, jak i wyjścia. -
Wyświetl pierwsze 5 wierszy pliku
/etc/passwd
i posortuj wyniki w odwrotnej kolejności alfabetycznej. -
Korzystając z utworzonego wcześniej pliku
contents.txt
, policz liczbę znaków w ostatnich 9 wierszach. -
Policz liczbę plików o nazwie
test
w katalogu/usr/share
i jego podkatalogach. Uwaga: każda linia wyjściowa poleceniafind
reprezentuje plik.
Ćwiczenia eksploracyjne
-
Wybierz drugie pole pliku
contents.txt
i przekieruj standardowe wyjście i wyjście błędów do innego pliku o nazwiefield1.txt
. -
Używając operatora przekierowania danych wejściowych i polecenia
tr
usuń myślniki (-
) z plikucontents.txt
. -
Jaka jest największa zaleta z przekierowywania do pliku tylko błędów?
-
Zastąp pojedynczą spacją wszystkie powtarzające się spacje w posortowanym alfabetycznie pliku
contents.txt
. -
W jednym wierszu poleceń usuń powtarzające się spacje (tak jak w poprzednim ćwiczeniu), wybierz dziewiąte pole i posortuj je w odwrotnej w kolejności alfabetycznej bez rozróżniania wielkości liter. Ile potoków musiałeś użyć?
Podsumowanie
W tym laboratorium nauczyłeś się:
-
O rodzajach przekierowań
-
Jak korzystać z operatorów przekierowania
-
Jak używać potoków (pipes) do filtrowania danych wyjściowych polecenia
Polecenia użyte w tej lekcji:
cut
-
Usuwa sekcje z każdego wiersza pliku.
cat
-
Wyświetla lub łączy pliki.
find
-
Wyszukuje pliki w hierarchii katalogów.
less
-
Wyświetla plik, aby użytkownik mógł przewijać plik wiersz po wierszu.
more
-
Wyświetla plik po jednej stronie na raz.
head
-
Wyświetla pierwsze 10 wierszy pliku.
tail
-
Wyświetla ostatnie 10 wierszy pliku.
sort
-
Sortuje pliki.
wc
-
Domyślnie zlicza wiersze, słowa lub bajty w pliku.
Odpowiedzi do ćwiczeń z przewodnikiem
-
Wypisz zawartość bieżącego katalogu, w tym prawa własności i uprawnienia, i przekieruj dane wyjściowe do pliku o nazwie
contents.txt
w Twoim katalogu domowym.$ ls -l > contents.txt
-
Posortuj zawartość pliku
contents.txt
z bieżącego katalogu i dołącz go na końcu nowego pliku o nazwiecontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Wyświetl ostatnie 10 wierszy pliku
/etc/passwd
i przekieruj je do nowego pliku w kataloguDocuments
Twojego użytkownika.$ tail /etc/passwd > Documents/newfile
-
Policz liczbę słów w pliku
contents.txt
i dołącz wynik na końcu plikufield2.txt
w swoim katalogu domowym. Będziesz musiał użyć przekierowania zarówno wejścia, jak i wyjścia.$ wc < contents.txt >> field2.txt
-
Wyświetl pierwsze 5 wierszy pliku
/etc/passwd
i posortuj wyniki w odwrotnej kolejności alfabetycznej.$ head -n 5 /etc/passwd | sort -r
-
Korzystając z utworzonego wcześniej pliku
contents.txt
, policz liczbę znaków w ostatnich 9 wierszach.$ tail -n 9 contents.txt | wc -c 531
-
Policz liczbę plików o nazwie
test
w katalogu/usr/share
i jego podkatalogach. Uwaga: każda linia wyjściowa poleceniafind
reprezentuje plik.$ find /usr/share -name test | wc -l 125
Odpowiedzi do ćwiczeń eksploracyjnych
-
Wybierz drugie pole pliku
contents.txt
i przekieruj standardowe wyjście i wyjście błędów do innego pliku o nazwiefield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Używając operatora przekierowania danych wejściowych i polecenia
tr
usuń myślniki (-
) z plikucontents.txt
.$ tr -d "-" < contents.txt
-
Jaka jest największa zaleta z przekierowywania do pliku tylko błędów?
Tylko przekierowanie błędów do pliku może pomóc w utrzymaniu regularnie monitorowanego pliku dziennika.
-
Zastąp pojedynczą spacją wszystkie powtarzające się spacje w posortowanym alfabetycznie pliku
contents.txt
.$ sort contents.txt | tr -s " "
-
W jednym wierszu poleceń usuń powtarzające się spacje (tak jak w poprzednim ćwiczeniu), wybierz dziewiąte pole i posortuj je w odwrotnej w kolejności alfabetycznej bez rozróżniania wielkości liter. Ile potoków musiałeś użyć?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
Ćwiczenie wykorzystuje 3 potoki, po jednym na każdy filtr.