Potoki i przekierowania

Kilka komend na początek

cat

konkatenacja plików (catenate)

cat FILE
wypisanie zawartości pliku
cat FILE1 FILE2
wypisanie skonkatenowanej zawartości pliku
-n, --number ponumeruj linie
-b, --number-nonblank
 ponumeruj niepuste linie
diff

porównaj pliki - jakie zmiany należy wprowadzić w pierwszy pliku, żeby był identyczny z drugim (difference)

diff FILE1 FILE2:

[linie pliku 1][adc][linie pliku 2]
< To co jest w pliku 1
---
> To co jest w pliku 2

a - added, d - deleted, c - changed

comm

porównaj pliki linia po lini - dane muszą być posortowane (compare)

comm FILE1 FILE2:

                asia
        asia
                basia
basia
casia
        dasia
  • kolumna 1 - to co jest tylko w pliku 1,
  • kolumna 2 - to co jest tylko w pliku 2,
  • kolumna 3 - to co jest zarówno w pliku 1 jak i 2.
echo

wyświetl napis (podany przez argumenty)

-e interpretuj znaki specjalne
-n nie dodawaj na końcu znaku nowej linii

echo hello world

echo -e "hello\nworld"

Przekierowanie do pliku

Z każdym procesem związane są przynajmniej 3 strumienie:

  1. stdout - standardowe wyjście
  2. stderr - standardowe wyjście błędów
  3. stdin - standardowe wejście
komenda > plik
zapisz stdout komendy do pliku
komenda >> plik
dopisz stdout na koniec pliku
komenda < plik
otwórz zawartość pliku jak stdin komendy
Przykłady
  • cat FILE1 > FILE2 - zapisz zawartość FILE1 do FILE2
  • man man > man
  • echo "ala ma kota" > plik
  • cat < FILE1
  • < FILE1 cat

Pliki anonimowe (here-documents)

Wywołaj komendę podając jako argument anonimowy plik:

cat <<XXX
...
XXX
  • Plik zostaje utworzony tylko na czas działania komendy;
  • Plik jest wpisany ręcznie i zakończony kombinacją znaków XXX (dowolna kombinacja);

Przykłady:

cat << EOF
ala ma kota
EOF

python <<END
import sys
print sys.platform
END

Czarna dziura

cat PLIK > /dev/null

Potoki (pipes)

KOMENDA_0 | KOMENDA_1 | ... | KOMENDA_N

stdout z komendy 0 jest podawane na stdin komendy 1, itp.

Przykłady
  • cat PLIK | less - otwórz plik, podaj zawartość do komendy less (która pozwoli na przewijanie w górę/w dół)
  • cat PLIK1 | head -n 1 | cat - PLIK2 > PLIK3 - otwórz plik 1, wytnij tylko pierwszą linię, połacz pierwszą linie pliku 1 z plikiem 2, zapisz do pliku 3

Filtry do przetwarzania potoków

tac
cat od tyłu
more
stronnicowanie wyników (spacja - następna strona, q - wyjście)
less
przewijanie listy wyników (strzałki - przewijanie, q - wyjście)
head

czyta początek pliku (strumienia) - domyślnie 10 linii

-n, --lines=K czytaj K pierwszych linii; jeśli K zaczyna się od znaku -, czytaj wszystkie linie pliku oprócz K ostatnich
tail

czyta koniec pliku (strumienia) - domyślnie 10 linii

-n, --lines=K czytaj K ostatnich linii; jeśli K zaczyna się od znaku +, czytaj wszystkie linie pliku oprócz K pierwszych
-f, --follow nie przerywaj czytania, wyświetlaj dane dopisywane do pliku w miare jak się pojawiają
wc

liczenie znaków/słów/linii (word count)

-c licz tylko znaki
-w licz tylko słowa
-l licz tylko linie
tr

tłumaczenie znaków (na inne znaki) (translate)

-s, --squeeze zamiast tłumaczyć, usuń powtórzenia
-d, --delete zamiast tłumaczyć, usuń znaki
-c, --C, --complement
 zamiast wykonywać operacje dla wskazanego zbioru znaków, wykonuj ją dla wszystkiego co nie mieści się we wskazanym zbiorze znaków (dopełnienie)

tr ab '.?' - zamień wszystkie litery a na kropki, wszystkie litery b na znaki zapytania

tr -d a - usuń wszystkie znaki a

tr -cd a - usuń wszystkie znaki inne niż a

tr -s ' ' - usuń wszystkie powtarzające się spacje

Klasy znaków: [upper:], [:lower:], [:alpha:], etc. (man tr - dokładny opis wszystkich klas)

cut

wycinanie pól (słów) z rekordu (linii)

-d, --delimiter
 separator pól
-f, --fields pola do wyświetlenia
-c, --complement
 wyświetl wszystkie pola które nie zostały wskazane (dopełnienie)
sort

sortowanie liniami

-r, --reverse odwróć kolejność
-n, --numeric-sort
 sortowanie wg wartości liczbowych
-f, --ignore-case
 nie zważaj na wielkośc znaków
uniq

usuń powtarzające się linie, działa na posortowanych danych (unique)

-c, --count policz powtarzające się linie
grep

(bardzo) konfigurowalny filtr - przepuszcza linie które pasują do zadanego wzorca (global regular expression print)

grep ala - przepuść linie które zawierają napis ala

-i, --ignore-case
 nie zważaj na wielkość liter
-v, --invert match
 przepuść tylko linie które nie pasują do wzorca (dopełnienie)
-e, --regexp=PATTERN
 zastosuj wyrażenie regularne do filtrowania
Wyrażenia regularne w pigułce:
  • ^ - początek linii
  • $ - koniec linii
  • . - dowolny znak
  • X? - (jakikolwiek) znak X wystąpi opcjonalnie
  • X* - (jakikolwiek) znak X może wystąpić dowolną liczbę razy (w tym: wcale)
  • \ - escape
Przykłady:
  • ^.$ - linia składająca sie tylko z jednego dowolnego znaku
  • ^mm*$ - linia składająca się z wyłącznie z przynajmniej jednej litery m
  • ^\t\. - linia rozpoczynająca sie od tabulatora po którym występuje znak .
tee

wypisz otrzymany strumień do strumienia wyjsciowego, a także do wskazanych plików

-a, --append dopisz zamiast nadpisywać
xargs

przekieruj strumień na argumenty do komendy

xargs echo - wszystko co zostanie wpisane na strumień wejściowy zostanie przekazane do komendy echo jako argumenty

-i, --replace=STRING
 wstaw każdy z argumentów za wskazany STRING, np. xargs -i{} echo "Hello, {}. Did you miss me?"
-0, --null przyjmij, że obiekty w strumieniu wejściowym są rozdzielone znakiem \0 zamiast \n (patrz np: find)
bc

kalkulator przyjmujący dane ze standardowego wejścia (basic calculator)

echo 2 + 2 | bc

bc jest kalkulatorem arbitrary precision, więc można (trzeba) zdefiniować ile miejsc po przecinku nas interesuje

echo "scale=2; 6 / 4" | bc

Zadania

http://www.cs.put.poznan.pl/csobaniec/edu/sop/doc/sop1-zadania.pdf (Rozdział 6: Potoki, strona 22)

Przekierowań cd.

Można się odwoływać do strumieni wyjsciowych i wejściowych przez ich identyfikatory: stdout - 1, stderr - 2, stdin - 0.

./noisegen 1> plik
przekierowuje stdout do pliku (ekwiwalent: >)
./noisegen 2> plik
przekierowuje stderr do pliku
./noisegen 1> plik1 2> plik2
przekierowuje stdout i stderr do plików
./noisegen 1> plik 2>> plik
przekierowuje stdout i stderr do jednego pliku

Można także przekierować strumień na inny strumień.

./noisegen 2>&1 | less
dodaje stderr do strumienia stdout (żeby uwzględnić przy korzystaniu z less)
./echo "BŁĄD!!!!1" 1>&2
dodaje stdout do strumienia stderr
./noisegen 2>&1 1>&2
wbrew pozorom, dodaje tylko stderr do stdout
./noisegen 3>&1 1>&2 2>&3
zamiana stdout z stderr
./noisegen 3>&1 1>&2 2>&3 3>&-
zamykamy strumień 3 na wszelki wypadek

Skrypt noisegen: http://www.cs.put.poznan.pl/ksiek/_downloads/noisegen1.sh (wymaga cowsay)

Podsumowanie

D>N

Zapis do pliku.

  • D to deskryptor pliku. N to nazwa pliku.
  • D może być pominięte - przyjmuje domyślną wartość 1.
D<N

Odczyt z pliku.

  • D to deskryptor pliku. N to nazwa pliku.
  • D może być pominięte - przyjmuje domyślną wartość 0.
D>&F

Przekierowanie na strumień.

  • D i F to deskryptory plików.
  • D może być pominięte - przyjmuje domyślną wartość 1.
D<&F

Przekierowanie ze strumienia.

  • D i F to deskryptory plików.
  • D może być pominięte - przyjmuje domyślną wartość 1.
C | C | ... | C
  • C to polecenia, np echo ...

Zadania

  1. Otwórz w przeglądarce adresy podane w (jakimś) pliku [xargs]
  2. Wyświetl częstotliwości taktowania wszystkich procesorów (w jednej linii) [/proc/cpuinfo xargs]
  3. Wygeneruj listę wszystkich słów które mają 8 liter, z których 3-cia to litera a, a ostatnią to literą jest y (do krzyżówki?). Wyświetl wyniki wielkimi literami. Zastosuj paginację lub przesuwanie wyników. [/usr/share/dict/words grep]
  4. Wyświetl 20 losowych cyfr [/dev/urandom]
  5. Wygeneruj 6 losowych 8-o znakowych haseł [fold]
  6. Podaj nazwę użytkownika który jest zalogowany najdłużej/najkrócej [sort who]
  7. Wypisz adres fizyczny (MAC) karty sieciowej komputera [ifconfig grep]
  8. Wypisz wszyskie adresy IP komputera [ifconfig grep]
  9. Wypisz 5 najpopularniejszych komend z historii [.bash_history sort uniq]
  10. Wypisz nazwy wszystkich zwykłych plików i linków w katalogu bieżącym [ls]
  11. Sprawdź który z użytkowników otworzył najwięcej plików (i ile to ich jest) [lsof sort uniq]
  12. Wypisz 5 najpopularniejszych rozszerzeń plików (bez katalogów) w swoim katalogu domowym [ls sort uniq]
  13. Jak wyżej, tylko typy plików (mimetype) zamiast rozszerzeń [sort uniq file]
  14. Policz linie kodu we wszytskich plikach katalogu z projektem (znaki \n) [find wc xargs]
  15. Jak wyżej, tylko policz średniki zamiast znaków nowej linii. [find tr xargs]
  16. Jak wyżej, tylko wypisz wiadomość na końcu z liczbą średników (np. "Semicolons: 644") [echo wc xargs]
  17. Wypisz informacje o copyright ze wszystkich plików z kodem w katalogu (po rozszerzeniu) [find cat xargs]
  18. Policz wszystkie pliki ukryte w swoim katalogu domowym [grep ls wc]
  19. Wypisz wartość 2^n dla n=1..100 [bc echo xargs]
  20. Wylicz średnią ocen dla każdego ze studentów w pliku przyklad.csv [xargs echo bc] (http://www.cs.put.poznan.pl/ksiek/SOP/resources/przyklad.csv)
  21. Wypisz wszystkie pliki i katalogi z katalogu /proc do pliku tymczasowego (np. /tmp/proc.log) i na ekran, ale nie pokazuj błędów. Włącz paginację albo przemieszczanie się po wynikach. [find tee /dev/null]