Dydaktyka:
FeedbackTo jest stara wersja strony!
Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki readline.
Część programów z przyczyn licencyjnych wybiera do tego samego celu libedit.
Readline pozwala na wygodną edycję linii poleceń i tworzenie historii poleceń.
Lista sensownych skrótów klawiszowych do edycji linii poleceń (nie uwzględniająca strzałek) jest tutaj: https://readline.kablamo.org/emacs.html
Pełna lista komend i przypisanych do nich skrótów jest w podręczniku systemowym
(man readline
i man bash
).
Konwencja zapisu skrótów klawiszowych to:
^x
lub C-x
to Ctrl+x (uwaga:^X
lub C-X
to Ctrl+Shift+x),M-x
to zwykle Alt-x (patrz: https://en.wikipedia.org/wiki/Meta_key),a b
to wciśnięcie po skrócie a skrótu b.
Bash domyślnie dopisuje historię wykonanych poleceń do pliku ~/.bash_history
w momencie wyjścia z powłoki.
Historię (tą z pliku połączoną z bieżącą) można wyświetlić komendą history
. (W man bash_builtins
znajduje się opis przełączników.)
Do wygodnego przeglądania historii można też użyć programu hstr
Zadanie 1 Jakim skrótem czyści się ekran?
Zadanie 2 Jakimi skrótami wyszukuje się wstecz w historii?
Zadanie 3 Jakim skrótem przesuwa się kursor o jedno słowo?
Zadanie 4 Jakim złożeniem skrótów przesuwa się kursor o 5 słów?
Zadanie 5 Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii?
Zadanie 6 Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii?
Zadanie 7 Jakim skrótem zamienia się kolejnością to słowo z poprzednim?
vi
jest często jedynym domyślnie instalowanym edytorem tekstowym.
vim
to ulepszona wersja vi
.
Żeby nauczyć się vim
, uruchom vimtutor
.
vi
jest wpisane w standard POSIX.
Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox.
Zadanie 8 Przejdź całą pierwszą lekcję w vimtutor
.
Zadanie 9 Przejdź pozostałe lekcje w vimtutor
.
Nano jest stosunkowo prostym edytorem tekstowym.
Podstawowe skróty są wyświetlone na dole ekranu.
Więcej na: https://www.nano-editor.org/docs.php
Emacs jest odwiecznym rywalem vim
a w konkurencji programów do edytowania tekstu w konsoli.
Po wpisaniu emacs
możesz wybrać tutorial skrótem Ctrl+h t.
Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego wejścia, a piszą do standardowego wyjścia.
Uniksopodobne systemy przez długie lata1) trzymały się założenia,
że każdy program ma solidnie wykonywać jedno dobrze określone zadanie.
Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne
przez takie proste programy.
Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu.
ps -ef
wypisuje procesy, więc zapisujesz do pliku ich listę: ps -ef > ps_output
.cut --delimiter ' ' --field 1 < ps_output > cut_output
.sort < cut_output > sort_output
sortujesz plik.uniq --count < sort_output
która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła.Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki
ps_output
, cut_output
i sort_output
.
W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego
programu ze standardowym wejściem innego programu.
Zamiast wykonywać powyższe komendy, można uruchomić
ps -ef | cut --delimiter ' ' --field 1 | sort | uniq --count
które robi to samo bez tworzenia żadnych plików na dysku.
Łączenie standardowego wyjścia jednego programu ze standardowym wejściem innego
jest technicznie wykonywane za pomocą specjalnego rodzaju pliku nazwanego
potokiem (pipe). Powłoka tworzy taki plik (w RAMie), zastępuje
standardowe wyjście jednego programu tym plikiem oraz zastępuje standardowe
wejście drugiego programu tym samym plikiem. Odczyt z potoku blokuje się do
czasu aż pojawią się na nim dane lub aż wszyscy piszący do potoku go nie zamkną.
Składnia cmd_a | cmd_b
łączy standardowe wyjście cmd_a ze
standardowym wejściem cmd_b.
Takie komendy są uruchamiane współbieżnie.
Programy trzymające się "filozofii UNIX'a" czytają z plików o ile podano je w
argumentach lub ze standardowego wejścia jeśli nie podano plików w argumentach.
Dodatkowo standardowe wejście jest używane ilekroć -
pojawia się w kontekście
nazwy pliku.
Do wykonania cmd_a | cmd_b
powłoka tworzy potok nienazwany
(anonimowy).
Można stworzyć potok nazwany używając komendy mkfifo nazwa_pliku
.
Dane zapisane do potoków, zarówno nazwanego jak i anonimowego, są przechowywane
w pamięci operacyjnej – nie są zapisywane na dysk. Odczytanie danych z potoku
usuwa je z pamięci.
user@host ~ $ hexdump -C f | column 00000000 41 6e 64 20 74 68 65 6e 20 74 68 65 72 65 20 77 |And then there w| 00000060 68 61 64 20 74 72 61 69 6e 65 72 20 77 68 65 65 |had trainer whee| 00000010 65 72 65 20 74 68 65 20 66 72 6f 67 73 2e 0a 56 |ere the frogs..V| 00000070 6c 73 20 6f 6e 20 69 74 2e 0a 20 20 20 20 20 20 |ls on it.. | 00000020 65 72 79 2c 20 76 65 72 79 20 73 6d 61 6c 6c 20 |ery, very small | 00000080 20 20 2d 2d 20 28 54 65 72 72 79 20 50 72 61 74 | -- (Terry Prat| 00000030 66 72 6f 67 73 2e 0a 54 68 65 79 20 68 61 64 20 |frogs..They had | 00000090 63 68 65 74 74 2c 20 57 69 6e 67 73 29 0a |chett, Wings).| 00000040 73 75 63 68 20 61 20 74 69 6e 79 20 6c 69 66 65 |such a tiny life| 0000009e 00000050 20 63 79 63 6c 65 20 69 74 20 73 74 69 6c 6c 20 | cycle it still | user@host ~ $ echo '1 2 3 * + p' | dc # dc is a RPN calculator 7 user@host ~ $ figlet -f small Ribbit-ribbit. | cowsay -nf bud-frogs | cat -n 1 _____________________________________________________ 2 / ___ _ _ _ _ _ _ _ _ _ _ \ 3 | | _ (_) |__| |__(_) |_ ___ _ _(_) |__| |__(_) |_ | 4 | | / | '_ \ '_ \ | _|___| '_| | '_ \ '_ \ | _|_ | 5 | |_|_\_|_.__/_.__/_|\__| |_| |_|_.__/_.__/_|\__(_) | 6 \ / 7 ----------------------------------------------------- 8 \ 9 \ 10 oO)-. .-(Oo 11 /__ _\ /_ __\ 12 \ \( | ()~() | )/ / 13 \__|\ | (-___-) | /|__/ 14 ' '--' ==`-'== '--' ' user@host ~ $ seq 30 | paste - - - # paste reads input files rount-robin, "-" is the standard input 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 user@host ~ $ mkfifo rura ┍ drugi terminal ┍ trzeci terminal user@host ~ $ fortune > rura │ user@host ~ $ date > rura │ user@host ~ $ cat < rura user@host ~ $ │ user@host ~ $ │ BOFH Excuse #156: │ │ │ │ Zombie processes haunting the computer │ │ nie, 1 sty 2023, 00:00:00 CET
Zadanie 10 Wykonaj echo '2+2*2'
. Potem wynik tego polecenia przekaż przez potok do bc
.
Zadanie 11 Użyj echo
do wyświetlenia jakiegoś teksu. Potem powtórz komendę
przekazując jej wynik w potoku do xxd
.
Zadanie 12 Wypisz listę plików w katalogu domowym.
Powtórz komendę przekazując w potoku jej wyniki do programu cat
.
Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do cat -n
.
Zadanie 13 Połącz w potok komendy ps -eF
i fold
Zadanie 14 Stwórz nazwany potok p. Przekieruj wejście programu fold
z p w jednym terminalu, a w drugim przekieruj wyjście ps -eF
do p.
Powtórz komendy wykonując ps
przed fold
.
Nazwą filtry określa się zbiorczo programy (w dużej części mające początki jeszcze w systemie UNIX) które czytają standardowe wejście, przetwarzają je w użyteczny sposób i piszą wynik do standardowego wyjścia.
head
i tail
wypisują podaną liczbę początkowych / końcowych
linii lub bajtów. Domyślnie oba programy wypisują 10 linii.
Przełącznikiem -n liczba
/ -c liczba
określa się liczbę
wypisywanych linii / bajtów.
Jeśli programowi head
poda się numer poprzedzony minusem ('-'),
np. head -n -10
, to wypisze linie poza ostatnimi 10.
Jeśli programowi tail
poda się numer poprzedzony plusem ('+'),
np. tail -n +10
, to wypisze linie zaczynając od linii nr 10.
user@host ~ $ cat nums.txt one two three four five six seven eight nine ten user@host ~ $ head -n2 nums.txt one two user@host ~ $ head -c5 nums.txt # ┌ the 5 bytes are: "one\nt"; notice no trailing newline one # └ that clutters next prompt with part of the output tuser@host ~ $head -n -9 nums.txt # this skips last 9 lines in file one user@host ~ $ tail -n1 nums.txt ten user@host ~ $ tail -n+9 nums.txt # ┌ this skips 8 first lines nine # └ (starts printing from 9th line) ten user@host ~ $ tail -c7 nums.txt # the 7 bytes are: 'ne\nten\n' ne ten user@host ~ $ ps PID TTY TIME CMD 7243 pts/5 00:00:00 bash 7332 pts/5 00:00:00 ps user@host ~ $ ps | tail -n+2 # real-world example: getting rid of a header 7243 pts/5 00:00:00 bash 7334 pts/5 00:00:00 ps 7335 pts/5 00:00:00 tail user@host ~ $ tail -n1 /var/log/messages # real-world example: displaying most recent entries in a log Jan 1 00:00:00 host kernel: OOM killer enabled.
Zadanie 15 Uruchom paste <(seq 15) <(seq 15 -1 1)
. Potem przetwórz w
potoku wynik tego polecenia wykorzystując head
i tail
tak, by wyświetlić:
Ważnym przełącznikiem programu tail
jest -f
/ --follow
.
tail -f …
najpierw wykona swoje normalne działanie, potem będzie na
bieżąco wyświetlać wszystkie dane które będą dopisywane do pliku.
Zadanie 16 Wykonaj seq 25 > plik
. Potem uruchom w jednym terminalu
tail -f plik
, a w drugim dopisz (przekierowaniem wyjścia) dane do pliku.
Komenda grep regex [plik]...
wypisuje linie z plików (lub
standardowego wejścia) które pasują do wyrażenia regularnego regex.
Przełącznik -r
/ -R
pozwala podać jako plik katalog. W takim wypadku
cała jego zawartość będzie przeszukiwana.
Jeśli podano -r
/ -R
i nie podano żadnego pliku, to rekurencyjnie
przeszukiwany jest bieżący katalog (a nie standardowe wejście).
grep
pozwala na wybór jednej z kilku gramatyk wyrażeń regularnych.
POSIX określa
dwie: basic (domyślną) i extended (używaną przez egrep
i grep -E
).
Szczegółów szukaj w dokumentacja twojej implementacji komendy grep
.
Domyślnie wyrażenia rozróżniają wielkość liter. Aby to zmienić, dodaj opcję -i
.
Opcja -v
powoduje wypisywane niepasujących linii.
Przełącznikami programu grep
można wybrać m. inn. czy pokazane mają być
wszystkie pasujące linie, ileś pierwszych pasujących linii bądź tylko nazwa
pliku z pasującymi liniami.
Można też wybrać czy wyniki mają być poprzedzone nazwą pliku i numerem linii
w pliku.
(Jeśli podano wiele plików, nazwa pliku jest domyślnie dodawana; jeśli plik jest
binarny zdaniem grep
a, domyślnie wyświetlane jest tylko czy pasuje.)
grep
może wyświetlić dodatkowo N linii przed (-B N
),
po (-A N
) lub przed i po (-C N
) każdej pasującej linii.
Przełączniki są nazwane od before, after i context
user@host ~ $ cat pteromyini lasolotka assapan latawiórka drzewolotka wiórolotka przelatucha polatucha wiewiórolot nocowiórek wełnolot sundalot stopowłos bruzdowiórek zębowiór wielkolot user@host ~ $ grep rolo pteromyini wiórolotka wiewiórolot user@host ~ $ grep '^p' pteromyini przelatucha polatucha user@host ~ $ grep -v o pteromyini assapan latawiórka przelatucha user@host ~ $ grep -vE 'l[oa]t|wiór' pteromyini assapan stopowłos user@host ~ $ grep -C1 wiórek pteromyini wiewiórolot nocowiórek wełnolot -- stopowłos bruzdowiórek zębowiór user@host ~ $ grep -r stop pteromyini:stopowłos
Zadanie 17 Przefiltruj seq 75
używając grep
tak by wyświetlone były linie:
5
5
5
lub 0
33
wraz z 3 liniami które je poprzedzają33
wraz z 2 liniami kontekstu
Zadanie 18
Wyświetl linie zawierające 10
w plikach /etc/passwd
i /etc/group
.
Zadanie 19
Wylistuj pliki zawierające ecdsa
w katalogu ~/.ssh
.
Program cut
wyświetla w każdej linii wybrane znaki (-c spec
) /
bajty (-b spec
) / pola (-f spec
).
Pole to dowolna ilość znaków oddzielona jednoznakowym separatorem (-d sep
, domyślnie tab).
Specyfikacja pól/bajtów/… to zakres[,zakres]...
, gdzie każdy zakres
to pozycja
, lub start-koniec
, lub start-
, lub -koniec
.
Dla przykładu, echo 123456789abcdef | cut -c -3,6,9-11,14-
wypisze 12369abef
(kolory dodano ręcznie dla lepszego zrozumienia).
user@host ~ $ cat ps PID TTY TIME CMD 29417 pts/27 00:00:00 bash 29422 pts/27 00:00:00 ps user@host ~ $ cut -c 7- ps # wypisuje znaki zaczynając od siódmego TTY TIME CMD pts/27 00:00:00 bash pts/27 00:00:00 ps user@host ~ $ cut -b 4,25 ps # czwarty i dwudziesty piąty bajt IC 1b 2p user@host ~ $ cut -f 2 -d ' ' ps # na początku pierwszej linii są dwie spacje, stąd 'puste' pole pts/27 pts/27
Zadanie 20 Przefiltruj wynik komendy mount
(lub pliku /etc/mtab
) tak
by wyciąć piąte (lub trzecie dla pliku /etc/mtab
) oddzielane spacjami pole
(które zawiera typ systemu plików).
Zadanie 21 Usuń z wyniku komendy
egrep '^[Ee]{2}' /usr/share/myspell/en_US.dic
ukośnik i wszystko za nim.
Program sort
domyślnie sortuje linie alfabetycznie (łącznie wszystkich
plików wejściowych lub standardowego wejścia).
Kolejne opcje -k
definiują klucze sortowania.
(Pola są oddzielane białymi znakami i naturalnie numerowane.)
sort -k4
używa pól 4,5,6,7,8,…sort -k4,4
używa tylko pola 4sort -k4,6
używa pól 4, 5 i 6sort -k5,4
sort -k5,5 -k4,4
używa pól 5 i 4
Klucze sortowania mogą mieć opcje, np. -n
sortuje numerycznie a
-r
odwraca kierunek.
Opcje można ustawić dla wszystkich kluczy naraz bądź dla każdego klucza z osobna:
sort -r -k5,5 -k4,4
sortuje malejąco zarówno po polu 5 i 4sort -k5,5r -k4,4
sortuje malejąco po polu 5 i domyślnie (rosnąco) po polu 4sort -k5,5 -k4,4r
sortuje domyślnie (rosnąco) po polu 5 i malejąco po polu 4
Domyślnie sortowanie nie jest stabilne; można zażądać stabilnego sortowania opcją -s
.
Informacje o dalszych możliwościach programu sort
znajdziesz w podręczniku.
user@host ~ $ cat file b l 1 (1) c r 2 (2) a l 11 (3) d l 3 (4) user@host ~ $ sort file │ user@host ~ $ sort -k2,2 file a l 11 (3) │ a l 11 (3) b l 1 (1) │ b l 1 (1) c r 2 (2) │ d l 3 (4) d l 3 (4) │ c r 2 (2) user@host ~ $ sort -r file │ user@host ~ $ sort -s -k2,2 file d l 3 (4) │ b l 1 (1) c r 2 (2) │ a l 11 (3) b l 1 (1) │ d l 3 (4) a l 11 (3) │ c r 2 (2) user@host ~ $ sort -k3 file │ user@host ~ $ sort -k 2,2 -k 1 file b l 1 (1) │ a l 11 (3) a l 11 (3) │ b l 1 (1) c r 2 (2) │ d l 3 (4) d l 3 (4) │ c r 2 (2) user@host ~ $ sort -n -k3 file │ user@host ~ $ sort -k 2,2r -k 1 file b l 1 (1) │ c r 2 (2) c r 2 (2) │ a l 11 (3) d l 3 (4) │ b l 1 (1) a l 11 (3) │ d l 3 (4)
Zadanie 22 Stwórz plik wejściowy dla następnych zadań kopiując i wklejając w powłokę następujące polecenie:
paste \ <(perl -e 'printf "%d\n", rand(10) for(1..20)') \ <(perl -e 'print((K,Q,J)[rand(3)]."\n") for(1..20);') \ <(perl -e 'printf "%d\n", rand(1500) for(1..20)') \ <(perl -e 'my @a=("a","b","c"); print $a[rand(@a)] . $a[rand(@a)] ."\n" for(1..20);') \ <(perl -e 'printf "%d\n", rand(1500) for(1..20)') \ <(perl -e 'my @a=("x","y","z"); print $a[rand(@a)] . $a[rand(@a)] ."\n" for(1..20);') \ <(seq -w 20) \ > random_data
Zadanie 23 Wyświetl plik random_data
. Potem go posortuj (domyślnie).
Zadanie 24 Posortuj plik random_data
ignorując dwa pierwsze pola. Potem
znów posortuj ten plik ignorując dwa pierwsze pola, ale tym razem numerycznie.
Zadanie 25 Posortuj plik random_data
używając pól z K/Q/J i pól ze
znakami xyz (w tej kolejności).
Zadanie 26 Posortuj plik random_data
używając tylko drugiego pola zarówno
bez jak i z opcją -s
(--stable
).
Zadanie 27 Posortuj plik random_data
po drugim polu (alfabetycznie)
i trzecim polu (numerycznie).
shuf
wypisuje linie w losowej kolejności.
Zadanie 28 Wykonaj seq 20 | shuf
.
Program wc
(word count) liczy linie, słowa i bajty.
Jeśli w argumentach poda mu się wiele plików, wypisuje zarówno informacje o każdym pliku z osobna jak i łączne wyniki.
Przełącznikami -l
, -w
i -c
można wybrać liczenie linii, słów i bajtów.
Przełącznik -m
liczy znaki (włączając niedrukowalne).
Liczba bajtów i znaków będzie różna jeśli plik zawiera wielobajtowe znaki, np. wc -mc <<< "‡∞♣"
zliczy 10 bajtów i 4 znaki (trzy widoczne i znak nowej linii).
Program uniq
domyślnie usuwa powtarzające się linie.
Z przełącznikami pozwala też między innymi na:
-c
— wpisanie przed każdą linię ilości powtórzeń-d
— wypisanie tylko powtarzających się linii-u
— wypisanie tylko niepowtarzających się linii
nl
numeruje linie. Pozwala też numerować linie w ustrukturyzowanych plikach tekstowych.
user@host ~ $ cat gi vivant omnes virgines, faciles, formosae, vivant omnes virgines, faciles, formosae, vivant et mulieres, tenerae, amabiles, bonae, laboriosae! bonae, laboriosae! user@host ~ $ wc gi 8 19 161 gi user@host ~ $ wc -w < gi 19 user@host ~ $ wc gi - <<< "Semper sint in flore!" 8 19 161 gi 1 4 22 - 9 23 183 razem user@host ~ $ tail -n 4 gi | uniq vivant et mulieres, tenerae, amabiles, bonae, laboriosae! user@host ~ $ tail -n 4 gi | uniq -c 1 vivant et mulieres, 1 tenerae, amabiles, 2 bonae, laboriosae! user@host ~ $ tail -n 4 gi | uniq -u vivant et mulieres, tenerae, amabiles, user@host ~ $ sort -r gi | uniq -d vivant omnes virgines, faciles, formosae, bonae, laboriosae!
Zadanie 29 Przefiltruj man wc
przez cat
. Potem przefiltruj man wc
przez wc
. Ile słów jest w man wc
?
Zadanie 30 Sprawdź wynik wc /etc/motd /etc/SUSE-brand
.
Zadanie 31 Polecenie perl -e 'printf "%d\n", (int rand(6)+1)+(int rand(6)+1) for(1..100)'
rzuca 100 razy 2d6.
Przefiltruj wyniki tego polecenia przez uniq
tak żeby zobaczyć kolejne rzuty z tymi samymi wynikami.
Przefiltruj wyniki tego polecenia przez sort
i uniq
tak żeby zobaczyć ile razy był uzyskany każdy wynik.
tac
wyświetla linie w odwrotnej kolejności (w każdym podanym pliku z osobna).
rev
wyświetla znaki w każdej linii w odwrotnej kolejności.
Zadanie 32 Obejrzyj wynik komendy echo -e '1 2 3\n4 5 6\n7 8 9'
.
Potem przefiltruj tą komendę przez tac
, następnie przez rev
.
Program tr
zamienia lub usuwa podane znaki.
Polecenie tr -d LISTA
usunie wszystkie znaki z LISTy.
Polecenie tr KTÓRE NACO
zamienia każdy n-ty znak z listy KTÓRE
na n-ty znak z listy NACO.
Jeśli NACO jest krótsze niż KTÓRE, nadmiarowe znaki z KTÓRE są
zmieniane na ostatni znak z NACO.
Przełącznik -s
powoduje, że (po dokonaniu zwykłej zamiany) ciągi identycznych
znaków x z listy NACO są zastępowane pojedynczym znakiem x.
Np. tr -s 123 npn <<< 123_132_13n_ppp
wypisze npn_np_n_p
.
Przełącznik -c
powoduje zamianę znaków których nie ma w liście.
Listy mogą zawierać zakresy znaków (np. [0-9]
, [a-f]
) i klasy znaków (np. [:alnum:]
, [:space:]
).
Uwaga: tr
nie przyjmuje nazw plików w liście argumentów - potrafi czytać tylko
ze standardowego wejścia.
user@host ~ $ cat Król… Król Karol kupił królowej Karolinie korale koloru koralowego. user@host ~ $ cat Król… | tr 'rl' 'lr' Klór Kalor kupił klórowej Kalorinie kolare korolu kolarowego. user@host ~ $ cat Król… | tr 'ol' 'k' Krók Karkk kupił krókkwej Karkkinie kkrake kkkkru kkrakkwegk. user@host ~ $ cat Król… | tr '[A-Z][:space:]' '[a-z]-' król-karol-kupił-królowej-karolinie-korale-koloru-koralowego.-user@host ~ $ user@host ~ $ cat Król… | tr -s 'wol' 'ok' Krók Kark kupił krókoej Karkinie krake kru krakoegk. user@host ~ $ cat Król… | tr -d 'aeioóuy' Krl Krl kpł krlwj Krln krl klr krlwg.
Zadanie 33 Przefiltruj wynik komendy ls -l
przez tr
tak, aby:
-
,rwx
Do bardziej złożonego zastępowania tekstu powszechnie używa się programu sed
.
sed
(stream editor) czyta wejście po linii naraz i wykonuje
podany (zwykle w linii poleceń jako argument) skrypt działający na linii
i domyślnie wypisuje ją po jego wykonaniu.
Najprostsza komenda wykonująca znajdź/zastąp to sed 's/regexp/replacement/'
.
sed
jest kompletne w sensie Turinga. Jeśli starczy czasu w semestrze, sed
będzie omawiany później.
awk jest językiem stworzonym do przetwarzania
tekstu, również przetwarzającym tekst linia po linii na podstawie podanego skryptu.
W awk
skrypt składa się z reguł – par warunek {instrukcje}
, gdzie warunek
określa dopasowanie do linii (bądź początku/końca przetwarzania/pliku).
awk
nie jest omawiany na zajęciach z SOp; jest omawiany w ramach obieralnego
przedmiotu Języki formalne i kompilatory.
Do wyświetlania tekstu nie mieszczącego się w terminalu można użyć jednego
z programów nazywanych zbiorczo pagerami.
Pager wyświetla naraz tyle tekstu ile zmieści się w terminalu ("stronę" tekstu)
i pozwala na przejście do kolejnej porcji tekstu (zwykle naciskając właściwy
klawisz, np. spacja).
Z większością systemów operacyjnych instalowany jest program more
będący prostym pagerem.
more
jest też częścią standardu POSIX.
Uniksopodobne systemy zwykle są wyposażone w program less
(którego hasło
marketingowe brzmi: less > more).
Jeśli zmienna środowiskowa $LESSOPEN
jest ustawiona, less
nie pokazuje
danych bezpośrednio, tylko najpierw przekazuje je do wskazanego przez tą zmienną
polecenia (np. zmieniając poleceniem LESSOPEN='|rev %s'
tą
zmienną dla bieżącej powłoki, less
będzie wypisywać w każdej linii znaki w
odwrotnej kolejności).
Takie programy zwykle próbują rozpoznać rodzaj pliku i dla znanych sobie nieczytelnych
dla człowieka typów plików wyświetlają czytelny dla człowieka ekwiwalent zawartości
żądanego pliku.
lesspipe
jest wiodącą implementacją tej
funkcji.
less
wspiera między innymi przełączniki:
-S
– nie zawijaj wierszy-R
– (sensowne) sekwencje sterujące są wypisywane (domyślnie są usuwane)-L
– wyłącza przetwarzanie wejścia przez polecenie wskazane w $LESSOPEN
-N
– numeruje wiersze
Po uruchomieniu less
można wyświetlić pomoc naciskając h
. Wybór przydatnych skrótów:
$EDITOR
; dostępne jeśli less
wyświetla plik)tail -f
)
Program man
używa programu less
jako domyślnego pagera.
Zadanie 34 Wpisz man less
żeby wyświetlić stronę dokumentacji dla less
przy pomocy programu less
. Przetestuj powyższe skróty.
Zadanie 35 Otwórz plik PDF (np. /usr/share/doc/packages/apparmor-docs/techdoc.pdf
) używając less
, bez opcji oraz z opcją -L
.
Otwórz archiwum tar
używając less
(np. /usr/share/doc/packages/automake/amhello-1.0.tar.gz
).
Otwórz katalog (np. /usr/include
) używając less
.
Program bat
, pretendujący do bycia
lepszą wersją programu cat
, automatycznie uruchamia pager jeśli dane do
wyświetlenia nie mieszczą się w terminalu.
Polecenie tee [-a] plik...
przepisuje dane ze standardowego wejścia
na standardowe wyjście oraz do każdego plików.
Domyślnie pliki są nadpisywane przez program tee
. Przełącznik -a
powoduje że pliki są otwierane w trybie dopisywania.
tee
jest często używane do jednoczesnego wyświetlania na ekranie wyniku
długo działającej komendy (dla monitorowania postępu) i zapisywania wyniku do
pliku (do późniejszego przetwarzania).
Zadanie 36 Wynik tree
przepuść w potoku przez tee
zapisującego do pliku.
Potem wyświetl plik używając less
.