Wprowadzenie do systemu UNIX
dr inż. Mariusz Kopeć pok. 103, D-4 tel. 888 5182 [email protected] Program wykładów
1. Podstawowe wiadomości o Uniksie 2. Rozpoczynamy pracę z systemem 3. Gdzie szukać pomocy? 4. Poznajemy podstawowe polecenia systemu 5. Podstawy pracy w powłoce bash 6. Poznajemy filtry 7. Tworzymy własne skrypty 8. Przetwarzamy pliki 9. Programy komunikacyjne i narzędzia sieciowe
(C) Mariusz Kopeć, WEiP AGH, 2015 2 Początki UNIXa
1965 MULTICS (MIT+ AT&T Bell Labs + GE) MULTiplexed Information and Computing Service
1969 AT&T Bell Labs wycofuje się z projektu; Ken Thompson i Dennis Ritchie (Bell Labs)
pracując na własną rękę, tworzą w oparciu o idee MULTICSa nowy system UNICS, (UNiplexed Information and Computing Service), który implementują na PDP-7
(C) Mariusz Kopeć, WEiP AGH, 2015 3 Początki UNIXa, cd
1971 AT&T UNIX First Edition (11/3/1971) pierwsza oficjalna wersja systemu, zawierająca procesor tekstu, zaimplementowana na PDP-11
1973 3-th Edition UNIX (3/73) pojawiły się potoki (pipes) i filtry oraz kompilator języka C. Jądro systemu napisane w asemblerze.
1973 4-th Edition UNIX (11/73) jądro systemu napisane w C.
1975 6-th Edition UNIX (V6 UNIX) pierwsza wersja systemu powszechnie dostępna poza Bell Labs.
(C) Mariusz Kopeć, WEiP AGH, 2015 4 BSD UNIX
Na skutek problemów prawnych AT&T nie mogło zarabiać na sprzedaży UNIXa – postanowiło więc udostępnić go uniwersytetom, gdzie system był dalej rozwijany.
1977 Bill Joy z Uniwersytetu Kalifornijskiego w Berkeley wydaje pierwszą wersję Berkeley Software Distribution, znaną jako 1BSD.
1980 W następstwie otrzymania kontraktu DARPA (Defense Advanced Research Projects Agency) Bill Joy tworzy w Berkeley kolejną dystrybucję: 4.1BSD.
1984 Powstaje 4.2BSD zawierająca TCP/IP. Rok wcześniej Bill Joy odchodzi, by stworzyć Sun Microsystems.
1986 Powstaje poprawiona wersja 4.3BSD.
1994 Powstaje ostatnia wersja z Berkeley: 4.4BSD.
(C) Mariusz Kopeć, WEiP AGH, 2015 5 AT&T UNIX
1982 UNIX System Group (AT&T) wypuszcza System III UNIX.
1983 UNIX System Development Labs (AT&T) wypuszcza System V UNIX Release 1 (SVR1).
1984 Powstaje System V UNIX Release 2 (SVR2).
1985 Pojawia się SVR3 zawierająca m.in. NFS (Network File System).
1992 UNIX System Labs (AT&T) wypuszcza SVR4.2.
1993 Novell kupuje USL od (AT&T) i wypuszcza SVR4.2MP.
1995 SCO (Santa Cruz Operation) kupuje Uniksa od Novella.
2001 Caldera (dystrybutor Linuxa) kupuje Uniksa od SCO.
(C) Mariusz Kopeć, WEiP AGH, 2015 6 Inne wersje UNIXa (wybrane)
Komercyjne
Xenix – Microsoft Ultrix – DEC HP-UX – HP AIX – IBM IRIX – SGI Mac OS X – Apple SunOS – Sun Solaris – Sun Unicos – CRAY OpenServer – SCO UnixWare - SCO ... Free
386/BSD – Bill Jolitz NetBSD FreeBSD – Jordan Hubbard OpenBSD – Theo de Raadt Minix – Andy Tannenbaum Linux – Linus Torvalds GNU – Richard Stallman
(C) Mariusz Kopeć, WEiP AGH, 2015 7 Linux
Kernel
Linus Torvalds, Univ. Helsinki, 1991
właściwy LINUX to kernel
Narzędzia (utilities)
Głównie z Free Software Foundation
GNU/Linux (GNU’s Not UNIX)
Dystrybucje
kernel + narzędzia + programy pomocnicze i instalacyjne
Red Hat Enterprise Linux – komercyjna wersja firmy Red Hat
Debian – projekt całkowicie niekomercyjny
Ubuntu – dystrybucja oparta na Debianie
openSuSE – dystrybucja GNU/Linux wspierana przez Novella
Slackware – najstarsza aktywnie rozwijana dystrybucja
(C) Mariusz Kopeć, WEiP AGH, 2015 8 System operacyjny UNIX
System operacyjny – zespół programów pośredniczących pomiędzy użytkownikiem komputera a warstwą sprzętową (hardware), organizujący całość pracy komputera, a w szczególności:
zarządzanie zasobami sprzętowymi;
obsługę urządzeń wejścia-wyjścia;
zarządzanie systemem plików;
obsługę kont użytkowników i kontrolę dostępu.
(C) Mariusz Kopeć, WEiP AGH, 2015 9 Warstwy systemu UNIX
Użytkownik Interfejs użytkownika Powłoki, polecenia, aplikacje Interfejs bibliotek (programy, kompilatory, Biblioteki systemowe interpretery, ...) (open, read, write, ...) Interfejs wywołań systemowych Jądro systemu (kernel) (zarządzanie procesami, pamięcią, zasobami, ...) Interfejs warstwy sprzętowej Warstwa sprzętowa (hardware) (CPU, pamięć, dyski, terminale, sterowniki, ...)
(C) Mariusz Kopeć, WEiP AGH, 2015 10 Zaczynamy pracę
Rodzaje i uprawnienia użytkowników
superuser
user
Identyfikacja użytkownika
username
password
Zmieniamy hasło
polecenie passwd
zasady doboru hasła (długość, zestaw znaków)
Kończymy pracę
exit
logout
(C) Mariusz Kopeć, WEiP AGH, 2015 11 Nazwy i polecenia
Nazwa
case sensitive
długość – zależna od implementacji (max. 255)
zestaw znaków
znaki alfanumeryczne [A-Z], [a-z], [0-9]
inne znaki: .=@#%^_+-:,
znaki specjalne: `!$&*(){}[];”|’\<>?/spacja
wprowadzanie znaku specjalnego, np.: Mój\ Plik
Polecenie
nazwa-polecenia opcje parametry
opcje najczęściej poprzedza „-”
parametry oddzielane spacjami
przykład: ls -l
(C) Mariusz Kopeć, WEiP AGH, 2015 12 Rozwijanie nazw
Rozwijanie nazw plików przez system:
znak * zastępuje dowolną grupę znaków, np.:
* plik1.dat plik2.dat test.out wyniki.dat wyniki.txt
wyjątek: „.” na początku
znak ? zastępuje jeden dowolny znak, np.:
plik?.dat plik1.dat plik2.dat
nawias kwadratowy [] określa grupę znaków z której może być wybrany jeden znak, np.:
[pt]*.* plik1.dat plik2.dat test.out
[p-t]*.* plik1.dat plik2.dat test.out
klamra {} podaje pasującą grupę znaków, np.:
w*.{dat,txt} wyniki.dat wyniki.txt
(C) Mariusz Kopeć, WEiP AGH, 2015 13 Pomoc on-line
man
man passwd
man 5 passwd
whatis (man –f)
whatis –h
whatis passwd
apropos (man –k)
apropos –h
apropos passwd
info
info –-usage
info passwd
(C) Mariusz Kopeć, WEiP AGH, 2015 14 Zmiany danych użytkownika
Zmiana hasła
passwd
Zmiana danych osobistych użytkownika
chfn
Zmiana defaultowej powłoki (shell) użytkownika
chsh
(C) Mariusz Kopeć, WEiP AGH, 2015 15 Przydatne informacje
Informacje o systemie
uname -a
Kim jesteśmy w sieci?
hostname
dnsdomainname
Kim jesteśmy w systemie?
whoami
who am i (who mom likes)
Kto pracuje w systemie?
who
w
(C) Mariusz Kopeć, WEiP AGH, 2015 16 System plików
wszystko jest plikiem:
pliki zwykłe
katalogi (zawierają inne pliki)
pliki urządzeń
struktura drzewa
wszystko zaczyna się od „/” (root – katalog główny)
podkatalogi zawierają się w katalogach lub podkatalogach
kolejne poziomy katalogów oddzielamy przez „/”, a nie przez „\” jak w Windows lub DOS
katalog bieżący oznaczamy „.”
katalog „rodzicielski” (parent directory) oznaczamy „..”
każdy plik posiada pełną ścieżkę dostępu, np.: /home/jan/prog/program1.c
(C) Mariusz Kopeć, WEiP AGH, 2015 17 System plików - przykład
/
etc usr bin home lib dev
bin local jan ewa adam
dane prog
program1.c
(C) Mariusz Kopeć, WEiP AGH, 2015 18 Operacje na katalogach
pwd wypisanie katalogu bieżącego > pwd /home/stud/kowalski
ls wypisanie zawartości katalogu > ls (tu to samo co ls /home/stud/kowalski) plik1.dat prog.e testy > ls -a . .. plik1.dat prog.e testy > ls –a * Zauważ: plik1.dat prog.e 1. * nie rozwija nazw . i ..
2. testy to katalog; listowana jest testy: jego zawartość . ..
(C) Mariusz Kopeć, WEiP AGH, 2015 19 Operacje na katalogach, cd
> ls –d * plik1.dat prog.e testy
> ls -l -rw-r--r-- 1 kowalski stud 10 Oct 10 2002 plik1.dat -rwxr-xr-x 1 kowalski stud 445 Jul 21 2001 prog.e drwxr-xr-x 2 kowalski stud 4096 Jul 21 2001 testy
mkdir utworzenie nowego katalogu > mkdir zajecia1;ls –d * plik1.dat prog.e testy zajecia1
> mkdir /home/stud/kowalski/zajecia1
(C) Mariusz Kopeć, WEiP AGH, 2015 20 Operacje na katalogach, cd
cd zmiana katalogu bieżącego > cd /usr/local;pwd /usr/local
> cd ..;pwd /usr > cd;pwd /home/stud/kowalski > cd -;pwd /usr
> cd ~/zajecia1;pwd /home/stud/kowalski/zajecia1
(C) Mariusz Kopeć, WEiP AGH, 2015 21 Operacje na katalogach, cd
rmdir usunięcie katalogu (pustego)
> cd > rmdir zajecia1; ls plik1.dat prog.e testy
> mkdir zajecia1 > mkdir zajecia1/zadanie1; ls zajecia1 zadanie1 > rmdir zajecia1 rmdir: `zajecia1’: Directory not empty
Katalog nie jest pusty – trzeba inaczej: > rm –r zajecia1; ls Ostrożnie! plik1.dat prog.e testy
(C) Mariusz Kopeć, WEiP AGH, 2015 22 Prawa dostępu do pliku
read wartość = 4 (r albo -)
write wartość = 2 (w albo -)
execute wartość = 1 (x albo -) -rwxr--r-- 1 user group ... prog1.e u g o others mod tego pliku = 744 group execute: user zwykły plik – program, script katalog – wykonanie cd - zwykły plik typ d katalog ...
(C) Mariusz Kopeć, WEiP AGH, 2015 23 Zmiana praw dostępu
Zmiana modu chmod [-R] [kto]op[zezw][,...] plik
kto - grupa znaków ugoa:
u – user
g – group
o – other
a – all (a=ugo)
op - operacja:
+ - dodaj zezwolenie
- - odbierz zezwolenie
= - zastąp zezwolenie
zezw - typ zezwolenia:
r – czytanie
w – pisanie
x – wykonanie (cd do katalogu)
(C) Mariusz Kopeć, WEiP AGH, 2015 24 Zmiana praw dostępu, cd
Przykłady:
chmod a+x plik1.e
chmod o-w plik1.e
chmod u=rw,go=r plik1.e
chmod [-R] kod_oktalny plik
kod_oktalny – suma kodów oktalnych w grupach:
user - r=400 w=200 x=100
group - r=040 w=020 x=010
others - r=004 w=002 x=001
Przykłady:
chmod 644 plik1.e
chmod 777 plik1.e
(C) Mariusz Kopeć, WEiP AGH, 2015 25 Zmiana praw dostępu, cd
Zmiana właściciela
chown [-R] user[:group] plik
user – właściciel pliku
group - właściciel grupowy
opcja –R - zmiany rekurencyjne w podkatalogach
Przykład:
chown jan:stud plik1.e
Zmiana właściciela grupowego
chgrp [-R] group plik
group - właściciel grupowy
opcja –R - zmiany rekurencyjne w podkatalogach
Przykład:
chgrp stud plik1.e
(C) Mariusz Kopeć, WEiP AGH, 2015 26 Operacje na plikach
Utworzenie pliku
touch > touch plik2.dat; ls –l plik2.dat -rwxr-xr-x 1 kowalski stud 0 ... plik2.dat
cat > cat > plik2.dat Linia1 wprowadzonego tekstu
dowolny edytor, np. vi > vi plik2.dat
(C) Mariusz Kopeć, WEiP AGH, 2015 27 Operacje na plikach, cd
rm - usuwa jeden lub wiele plików (katalogów) > rm plik usuwa plik > rm –r katalog usuwa rekurencyjnie katalog > rm –i * usuwa po potwierdzeniu
cp - kopiuje pliki (katalogi) > cp plik1 plik2 kopiuje plik1 do plik2 > cp –R katalog1 katalog2 kopiuje rekurencyjnie katalog1 do katalog2
mv – przenosi lub przemianowuje pliki (katalogi) > mv plik1 plik2 przemianowuje plik1 na plik2 > mv plik1 katalog1 przenosi plik1 do katalogu1
(C) Mariusz Kopeć, WEiP AGH, 2015 28 Operacje na plikach, cd
Wypisanie zawartości pliku
cat – wypisanie zawartości jednego lub kilku plików > cat plik2.dat Linia1 wprowadzonego tekstu Linia2 wprowadzonego tekstu
more – wypisanie zawartości pliku strona po stronie > more plik3.dat
less – wypisanie zawartości pliku strona po stronie > less plik3.dat
tac – wypisanie zawartości pliku od końca > tac plik2.dat Linia2 wprowadzonego tekstu Linia1 wprowadzonego tekstu (C) Mariusz Kopeć, WEiP AGH, 2015 29 Operacje na plikach, cd
Wypisanie fragmentu pliku
head – wypisanie początkowych linii pliku (plików)
head plik1 pierwsze 10 linii pliku
head –n plik1 plik2 pierwsze n linii każdego pliku
tail – wypisanie końcowych linii pliku (plików)
tail plik1 ostatnie 10 linii pliku
tail –n plik1 ostatnie n linii pliku
tail +n plik1 10 linii poczynając od n-tej linii
Wypisanie zawartości pliku w kolumnach
column – tworzenie tabeli
column –t plik1 separatorem jest „biały znak”
column –t –s: plik1 separatorem jest :
(C) Mariusz Kopeć, WEiP AGH, 2015 30 Operacje na plikach, cd
Dzielenie plików
cut – wycina kolumny lub pola z pliku
cut –c10-15 plik1 wypisuje 10.-15. znak z linii pliku
cut –f3 –d\ plik1 wypisuje 3. pole z linii pliku
csplit – dzieli plik na części
csplit plik1 10 30 tworzy trzy pliki: xx00, xx01, xx02 zawierające linie: 1 do 9, 10 do 29, od 30
csplit plik1 /wz1/ /wz2/ tworzy trzy pliki: xx00 – od pierwszej linii, xx01 – od linii zawierającej wzorzec wz1 xx02 – od linii zawierającej wzorzec wz2
(C) Mariusz Kopeć, WEiP AGH, 2015 31 Operacje na plikach, cd
Łączenie plików
cat – łączy kilka plików w jeden (konkatenacja)
cat p1 p2 p3 łączy kolejno p1, p2, p3
paste – łączy równolegle linie plików
paste plik1 plik2 wypisuje w jednej linii odpowiednie linie plików plik1 i plik2
join – łączy równolegle linie plików z polem łączącym
Przykład: plik1: rok1 anna plik2: rok1 jan rok2 ewa rok3 tom > join plik1 plik2 rok1 anna jan
(C) Mariusz Kopeć, WEiP AGH, 2015 32 Operacje na plikach, cd
Sortowanie plików i ich przetwarzanie
sort – sortuje jeden lub kilka plików (konkatenacja)
sort plik1 sortuje plik1
sort –k 2 p1 p2 dołącza p2 do p1 a następnie sortuje wg pola 2
uniq – usuwa powtarzające się linie
uniq plik1
uniq –t: -W2 plik1 bada tylko 2 pierwsze pola „:” jest separatorem pól
comm – wypisuje takie same linie z dwóch plików
comm plik1 plik2
(C) Mariusz Kopeć, WEiP AGH, 2015 33 Operacje na plikach, cd
Porównywanie plików
cmp – porównuje dwa pliki lub ciągi bajtów
cmp plik1 plik2 pokazuje pierwszą różnicę
sdiff – wypisuje różnice między plikami
sdiff -s p1 p2 wypisuje różniące się linie
sdiff –i -s p1 p2 ignoruje wielkość liter
vimdiff – pokazuje różnice między trzema plikami
vimdiff p1 p2 pokazuje różniące się linie i znaki
(C) Mariusz Kopeć, WEiP AGH, 2015 34 Ustalanie charakteru pliku
file – określenie charakteru pliku:
> file ls.txt ls.txt: ASCII English text, ...
> file /bin/ls /bin/ls: ELF 32-bit LSB executable, ...
stat – wypisanie statusu pliku:
> stat ls.txt File: „ls.txt” Size: 7132 Device: 851h/2129h Access: (0744/-rw-r—r-) Uid: (751/.) Gid: (700/.) Access: Tue Nov 4 14:02:00 2003 Modify: Mon Oct 27 11:48:40 2003 Change: Mon Oct 27 11:50:45 2003
(C) Mariusz Kopeć, WEiP AGH, 2015 35 Filtry
Przetwarzają w określony sposób pliki wejściowe, np:
wyszukują wzorce
sortują
wycinają fragmenty linii
edytują
zliczają znaki, słowa, linie
Działają zazwyczaj w trybie potokowym
Potoki (pipes) – przesyłają wyjście jednego polecenia bezpośrednio na wejście następnego:
polecenie1 | polecenie2 [ | polecenie3 ...] > ls -l | sort > cat ls.txt | head –n20 | wc
(C) Mariusz Kopeć, WEiP AGH, 2015 36 Filtry: wc (word count)
Wypisuje liczbę linii, słów, znaków w pliku
wc [opcje] [plik] [...]
wc ls.txt wypisuje liczbę linii, słów i znaków w ls.txt
wc -l ls.txt wypisuje tylko liczbę linii w pliku ls.txt
wc -w ls.txt wypisuje tylko liczbę słów w pliku ls.txt
wc -c ls.txt wypisuje tylko liczbę znaków w pliku ls.txt
wc -l *.txt wypisuje liczbę linii w każdym z plików o zakończeniu „.txt” oraz ich sumę
wc jako filtr
> ls –l /usr/games | wc –l 50
(C) Mariusz Kopeć, WEiP AGH, 2015 37 Filtry: grep
Wyszukuje linie zawierające wzorzec
grep [opcje] wzór [plik ...]
grep ‘wz’ * wypisuje linie zawierające łańcuch ‘wz’, poprzedzone nazwą pliku
grep –v ‘wz’ * wypisuje linie nie zawierające łańcucha ‘wz’, poprzedzone nazwą pliku
grep –c ‘wz’ * wypisuje tylko nazwy plików i liczby linii zawierających łańcuch ‘wz’
grep –inr ‘wz’ * wypisuje nazwy plików i numery linii zawierających ‘wz’ ignorując różnice wielkości liter. Badane są pliki w katalogu bieżącym i rekurencyjnie w podkatalogach.
(C) Mariusz Kopeć, WEiP AGH, 2015 38 Filtry: grep
grep –A3 ‘wz’ * wypisuje linie zawierające łańcuch ‘wz’ po których każdorazowo pojawiają się po 3 linie znajdujące się bezpośrednio przed każdą z nich
grep –B3 ‘wz’ * wypisuje linie zawierające łańcuch ‘wz’ po których każdorazowo pojawiają się po 3 linie znajdujące się bezpośrednio za każdą z nich
grep –-color ‘wz’ * wypisuje linie zawierające łańcuch ‘wz’ zaznaczając kolorem dopasowany wzorzec
grep –f plik * wzorce pobierane są kolejno z pliku plik i wypisywane są odpowiadające im linie
grep –o ‘wz’ * wypisuje tylko fragment linii odpowiadający podanemu wzorcowi
(C) Mariusz Kopeć, WEiP AGH, 2015 39 Filtry: grep – wzorce
wzorzec – wyrażenie regularne:
. dowolny znak
‘plik.a’ plik1a, plikaa12, ale nie plika
\ następny znak nie jest traktowany jako specjalny
‘plik\.’ plik.12, plik., ale nie plik1
* zero lub więcej powtórzeń poprzedniego znaku
‘plik.*a’ plik.12a, plika123a, plik1a, ...
[...] dowolny znak (jeden) z podanej listy
[Pp]lik Plik, plik, ...
[^...] dowolny znak nie występujący na liście
[^Pp]lik klik, ale nie plik
(C) Mariusz Kopeć, WEiP AGH, 2015 40 Filtry: grep – wzorce, cd
^ początek linii
‘^plik’ plik1a, plikaa12, ale nie replika
$ koniec linii
‘plik$’ nowyplik, ale nie plik1
\b łańcuch na krawędzi słowa
‘\bplik’ plik.12a, plika123a, ale nie replika
‘plik\b’ nowyplik
\(...\) określenie podwyrażenia
\(plik\) plik jest pierwszym podwyrażeniem
\n odwołanie do n-tego podwyrażenia
\(plik\).*\1 plik.*plik
(C) Mariusz Kopeć, WEiP AGH, 2015 41 Filtry: grep
Przykłady zaawansowanego użycia wzorców:
> grep –v ’^$’ ls.txt
Wypisuje wszystkie niepuste linie
> grep ’\(time\).*\1’ ls.txt
Wypisuje wszystkie linie, w których „time” występuje więcej niż jeden raz
> grep ’\btime\b’ ls.txt
Wypisuje wszystkie linie, w których „time” występuje jako samodzielne słowo
> file /etc | grep ’English text.*with’
Wypisuje z katalogu /etc nazwy plików zawierających tekst angielski z dodatkowymi atrybutami
(C) Mariusz Kopeć, WEiP AGH, 2015 42 Filtry: sed – edytor strumieni
Wykonuje ciąg poleceń edycyjnych na pliku
sed [-e skrypt] [...] [-f plikskryptu] [...] plik
skrypt – ciąg poleceń; może być kilka skryptów
plikskryptu – plik zawierający skrypt; może być ich kilka
Wybrane przykłady:
> sed ’11,174d’ ls.txt
Kasuje z pliku ls.txt linie 11-174
> sed –n ’1,/Sort/p’ ls.txt
Wypisuje z ls.txt tylko linie od 1 do zawierającej „Sort”
> sed –n ’/file/p’ ls.txt
Wypisuje z ls.txt tylko linie zawierające „file”
(C) Mariusz Kopeć, WEiP AGH, 2015 43 Filtry: sed – przykłady
> sed –n ’s/character/file/p’ ls.txt
Zamienia w ls.txt „character” na „file” i wypisuje tylko linie w których dokonano zmian
> sed –n –e’s/character/file/g’ \ ? –e’s/file/FILE/p’ ls.txt
Zamienia w ls.txt „character” na „file” a następnie „file” na „FILE” i wypisuje linie w których dokonano drugiej zmiany
> sed –n ’/mod/s/time/TIME/p’ ls.txt
Zamienia „time” na „TIME” tylko w liniach zawierających „mod”, po czym wypisuje linie w których dokonano zmian
> ls –1 /usr/games | sed –n ’/^[crw].*s$/p’
Wypisuje z katalogu /usr/games nazwy plików zaczynające się na „c” lub „r” lub „w”, a kończące się na „s”.
(C) Mariusz Kopeć, WEiP AGH, 2015 44 Filtry: tr – zamienia znaki
Usuwa lub zamienia określone znaki innymi
tr [opcje] zestaw1 [zestaw2]
zestaw1 – znaki do usunięcia lub zastąpienia
zestaw2 – znaki zastępujące odpowiednio znaki z zestawu1
Wybrane przykłady:
tr –d eEoO < ls.txt | head
Usuwa z pliku ls.txt znaki „e”, „E”, „o” i „O”
tr ”[A-Z]” ”[a-z]” < ls.txt | head
Wypisuje plik ls.txt zamieniając duże litery na małe
ls –l /usr | tr –s ”[:space:]”
Wypisuje zawartość katalogu /usr zastępując ciąg spacji jedną spacją
echo J mpwf Vojy | tr B-z A-y ?
(C) Mariusz Kopeć, WEiP AGH, 2015 45 Filtry: awk (gawk)
Polecenie to zostanie omówione dokładniej w dalszej części wykładów
Przetwarza w określony sposób plik wejściowy
gawk ’wzór {akcja}’ [plik] [...]
Wybrane przykłady:
> gawk ’/Andrzej/’ /etc/passwd
Wypisuje z pliku /etc/passwd linie zawierające łańcuch „Andrzej”
> cat /etc/passwd | gawk ’/^[m-s].*\/csh$/’
Wypisuje z pliku /etc/passwd linie użytkowników zaczynających się na litery od „m” do „s”, używających csh jako login shell (ale nie tcsh)
> cat /etc/passwd | gawk –F: \ ? ’length($1)<7 {print $1,”\t”,$5}’
Wypisuje z pliku /etc/passwd pierwsze i piąte pole każdej linii, przyjmując za separator pól znak „:”. Pomiędzy polami wpisywany jest znak tabulacji. Wypisywanie następuje jeżeli pierwsze pole liczy mniej niż 7 znaków.
(C) Mariusz Kopeć, WEiP AGH, 2015 46 Filtry: tee
Kopiuje wejście na wyjście i dodatkowo do pliku
tee [-a] plik [...]
-a – dołącz do istniejącego pliku
Wybrane przykłady:
cat ls.txt | tee kopia1 kopia2 | less
Wypisuje na ekranie plik ls.txt (strona po stronie) i tworzy dwie kopie: kopia1 i kopia2
ls –l /usr/games | tee usr.games | wc
Wypisuje ilość plików w katalogu /usr/games, którego zawartość zachowana zostaje w pliku usr.games
who | sort | tee users
Wypisuje posortowaną listę zalogowanych użytkowników i zachowuje ją w pliku users
(C) Mariusz Kopeć, WEiP AGH, 2015 47 Filtry: przykłady
who | tr –s ”[:space:]” | cut –f5 –d’ ’ | sort
Ciągi spacji na wyjściu komendy zamieniane są na jedną spację, następnie wycinane jest piąte pole z linii, przyjmując, że spacja jest separatorem. Posortowane wyjście wypisywane jest na ekran.
ls –la /etc | grep ’^d’ | wc -l
Wypisywana jest liczba podkatalogów w katalogu /etc. (Gdzie można sprawdzić czy jest poprawna?)
cat /etc/passwd | column –s: -t | sort | less
Lista zarejestrowanych w systemie użytkowników wypisywana jest strona po stronie w formie posortowanej tabeli.
sort ls.txt | uniq | tee linie | wc -l Z posortowanego pliku ls.txt usuwane są powtarzające się kolejne linie, a wynik zapisywany jest w pliku „linie”. Na ekran wyświetlana jest ilość linii.
(C) Mariusz Kopeć, WEiP AGH, 2015 48 Kompresja plików
gzip – kompresja/dekompresja zawartości plików
gzip [opcje] [plik] [...]
Wybrane przykłady:
gzip ls.txt
Kompresuje plik ls.txt, na którego miejsce tworzony jest ls.txt.gz.
gzip –d ls.txt ( gunzip ls.txt)
Dekompresuje plik ls.txt.gz, przywracając ls.txt.
gzip –r *
Kompresuje wszystkie pliki w bieżącym katalogu i w podkatalogach
gzip –dr * ( gunzip –r *)
Dekompresuje wszystkie pliki w bieżącym katalogu i w podkatalogach.
(C) Mariusz Kopeć, WEiP AGH, 2015 49 Archiwizacja plików
tar – archiwizuje i odtwarza pliki
tar [opcje] [plik] [...]
-c tworzy nowe archiwum
-r dodaje pliki do istniejącego archiwum
-x wyciąga pliki z archiwum
-f nazwa podaje nazwę archiwum
-t listuje zawartość archiwum
-v informuje o wykonywanych operacjach
-z lub -j kompresja/dekompresja programem gzip lub bzip2
Wybrane przykłady:
tar –cvf mojkatalog.tar * Tworzy archiwum mojkatalog.tar z bieżącego katalogu.
tar –tvf mojkatalog.tar Listuje zawartość archiwum mojkatalog.tar.
(C) Mariusz Kopeć, WEiP AGH, 2015 50 Wyszukiwanie plików
find – wyszukuje pliki i (opcjonalnie) wykonuje na nich polecenia
find [lista katalogów] [wyrażenie]
lista katalogów: - lista nazw katalogów, które mają być przeszukiwane; - nazwy oddzielone spacjami; - jeżeli jej nie ma, przyjmowany jest katalog bieżący.
wyrażenie: - określa kryterium poszukiwań; - składa się z wyrażeń pierwotnych zwracających wartość ”prawda” lub ”fałsz”; - wyrażenie pierwotne mogą być grupowane lub łączone za pomocą operatorów logicznych; - jeżeli dla danego pliku wyrażenie jest fałszem, operacja jest przerywana i następuje przejście do kolejnego pliku.
(C) Mariusz Kopeć, WEiP AGH, 2015 51 Wyszukiwanie plików, cd
podstawowe wyrażenia pierwotne:
-name plik prawda, jeżeli plik odpowiada nazwie bieżącej
-user użytkownik prawda, jeżeli plik należy do użytkownika użytkownik
-newer splik prawda, jeżeli plik jest nowszy niż splik
-type c prawda, jeżeli plik jest typu c (b,c,d,p,f,l,s)
-print prawda; wypisuje nazwę pliku
-exec polecenie prawda jeżeli polecenie zwraca kod wyjścia 0; polecenie kończy się znakiem \; nazwa pliku jest reprezentowana przez {}
(C) Mariusz Kopeć, WEiP AGH, 2015 52 Wyszukiwanie plików, cd
operatory:
\( ... \) grupowanie
! ... negacja
-a (lub nic) koniunkcja
-o alternatywa
przykłady:
find . –name ’*.cpp’ -print
find . –atime +20 –exec rm {} \;
find . \( -name ’*.[cf]’ –o –name ’*.old’ \) \ –atime –5 -print –exec cat {} \;
find . –name ’*.cpp’ –size 512c rm {} \;
(C) Mariusz Kopeć, WEiP AGH, 2015 53 Wyszukiwanie plików, cd
slocate – wyszukuje pliki w bazie danych systemu
slocate [opcje] wzorzec_nazwy
najważniejsze opcje: - i ignoruj różnice w wielkości liter; - e wypisuj tylko istniejące pliki (co spowalnia działanie);
wzorzec_nazwy: - określa wzorzec nazwy wyszukiwanych plików; - uwaga: metaznaki ’*’, ’?’, ’[’ i ’]’ nie traktują w sposób specjalny znaków ’.’ i ’/’; - jeżeli wzorzec nazwy jest wyrażeniem prostym bez metaznaków, to zwracane nie są nazwy plików zgodne z podanym wyrażeniem, ale zawierające podane wyrażenie;
przykład: slocate plik
(C) Mariusz Kopeć, WEiP AGH, 2015 54 Wyszukiwanie plików, cd
whereis – wyszukuje pliki binarne, źródłowe albo pliki manuala poleceń
whereis [opcje] nazwa
najważniejsze opcje: - b wypisuje tylko pliki binarne; - m wypisuje tylko pliki manuala; - s wypisuje tylko pliki źródłowe; - u wypisuje pliki nie należące do powyższych kategorii
przykłady:
whereis ls
whereis –m l*
whereis –m –u l*
(C) Mariusz Kopeć, WEiP AGH, 2015 55 Lokalizacja pliku polecenia
which – podaje pełną nazwę pliku, który zostanie wywołany w przypadku wykonywania polecenia o podanej nazwie
which [-a] nazwa
opcja -a: wypisuje wszystkie nazwy plików o podanej nazwie, które mogą zostać wykonane;
przykłady:
which test
which –a te*
which –a MojProg
(C) Mariusz Kopeć, WEiP AGH, 2015 56 Powłoki (shells)
Podstawowe zadania powłoki:
interfejs między użytkownikiem a jądrem
interpreter poleceń
język programowania
Najważniejsze rodzaje powłok:
sh (Bourne shell)
bash (Bourne again shell)
csh (C shell)
tcsh (C shell improved)
(C) Mariusz Kopeć, WEiP AGH, 2015 57 Powłoki
Co robi powłoka:
wczytuje wejście (z pliku lub terminala)
dzieli wejście na słowa i operatory (tokeny)
przetwarza tokeny na polecenia
zamienia pewne tokeny (np. *) na odpowiednie listy (np. plików)
dokonuje odpowiednich przekierowań strumieni i usuwa odpowiednie operatory i argumenty z listy
wykonuje polecenie
czeka na zakończenie polecenia (opcjonalnie)
(C) Mariusz Kopeć, WEiP AGH, 2015 58 bash – znaki specjalne
Niektóre znaki specjalne powłoki:
metaznaki
| potok (pipe)
<, > przekierowanie strumieni
(, ) definiowanie podpowłoki
; koniec polecenia
& wykonanie polecenia w tle
blank spacja lub tabulator metaznaki nie muszą być otoczone przez blank
(C) Mariusz Kopeć, WEiP AGH, 2015 59 bash – znaki specjalne
inne znaki specjalne:
# komentarz (działa do końca linii)
\Enter kontynuacja w następnej linii
anulowanie specjalnego znaczenia znaków:
\ następny znak (poza Enter) nie ma specjalnego znaczenia, np: > mkdir Moje\ wyniki
’ ’ anuluje specjalne znaczenie znaków
” ” anuluje specjalne znaczenie znaków z wyjątkiem znaków ’$’, ’\’, ’`’
(C) Mariusz Kopeć, WEiP AGH, 2015 60 bash - rozwinięcia
rozwinięcie nawiasów klamrowych {}:
{a,b} podstawiana jest lista a b : > echo {a,b}{a,b} aa ab ba bb
rozwinięcie tyldy ~:
~ $HOME (katalog domowy użytkownika) > echo ~ /home/prac/mariusz
~aga katalog domowy użytkownika aga > echo ~aga /home/stud/aga
~nic jeżeli wynikowy katalog nie istnieje to rozwinięcie nie jest przeprowadzane
(C) Mariusz Kopeć, WEiP AGH, 2015 61 bash - rozwinięcia
rozwinięcie parametrów:
ustalam przykładowo wartość parametru par: > par=projekt
${par} projekt (= $par) > echo ${par} projekt
${par:-słowo} jeżeli parametr par jest ustawiony to podstawiana jest jego wartość : > echo ${par:-~} projekt jeżeli nie, podstawiana jest wartość słowa, a parametr nie jest ustawiany: > echo ${rap:-~} /home/prac/mariusz
(C) Mariusz Kopeć, WEiP AGH, 2015 62
${par:=słowo} jeżeli parametr par nie jest ustawiony to podstawiana jest do niego wartość słowa: > echo $rap
> echo ${rap:=~} /home/prac/mariusz > echo $rap /home/prac/mariusz
${par:+słowo} jeżeli parametr par nie jest ustawiony to rozwinięcie jest puste; jeśli jest ustawiony, rozwinięcie jest rozwinięciem słowa: > echo ${par:+~} /home/prac/mariusz > echo $par projekt
(C) Mariusz Kopeć, WEiP AGH, 2015 63 bash - podstawienia
podstawienie poleceń:
$(polecenie) podstawiany jest wynik polecenia
albo
`polecenie` podstawiany jest wynik polecenia
> echo ’Dlugosc pliku:’ \ > `cat ls.txt | wc –l` \ > ’linii’ Dlugosc pliku: 198 linii
(C) Mariusz Kopeć, WEiP AGH, 2015 64 bash - podstawienia
podstawienie nazw plików:
* ciąg znaków (w tym pusty) nie zaczynający się od ’.’
? jeden dowolny znak (ale nie ’.’ na początku)
[...] jeden z wymienionych znaków
[.-.] jeden znak z zakresu
[!...] jeden znak z wyłączeniem wymienionych
jak to działa?
wynikiem podstawienia jest lista nazw plików z bieżącego katalogu, pasujących do podanego wzorca
jeżeli lista taka jest pusta, podstawienie nie jest dokonywane (wynikiem jest sam wzorzec)
(C) Mariusz Kopeć, WEiP AGH, 2015 65 bash - rozwinięcia
rozwinięcie arytmetyczne:
$(( wyrażenie ))
jak to działa?
wszystkie elementy wyrażenia podlegają rozwinięciu parametrów i podstawieniu poleceń
wynikiem rozwinięcia jest wynik wyrażenia arytmetycznego
przykłady:
> echo $((2+5)) 7
> echo $((`ls –l | wc –l`+3)) 55
> echo $((`wc –l
(C) Mariusz Kopeć, WEiP AGH, 2015 66 bash - rozwinięcia
kolejność działań w rozwinięciu:
id++ id-- post-in/dekrementacja zmiennej
++id --id pre-in/dekrementacja zmiennej
- + znak – lub +
! ~ negacja logiczna i binarna
** potęgowanie
* / % mnożenie, dzielenie, modulo
+ - dodawanie i odejmowanie
<< >> przesunięcia bitowe
< > <= >= porównania arytmetyczne
== != równość i nierówność
(C) Mariusz Kopeć, WEiP AGH, 2015 67 bash - rozwinięcia
kolejność działań, cd:
& bitowe AND
^ bitowe XOR
| bitowe OR
&& logiczne AND
|| logiczne OR
expr ? expr : expr wyrażenie warunkowe
= *= /= %= += -= <<= >>= &= ^= |= przypisania
expr1 , expr2 przecinek
(C) Mariusz Kopeć, WEiP AGH, 2015 68 bash - przekierowania
przekierowanie strumieni:
numery strumieni:
0 – standardowe wejście
1 – standardowe wyjście
2 – wyjście diagnostyczne (error)
przekierowanie wejścia: przekierowanie wyjścia: >word przekierowanie wyjścia diagn.: 2>word łączne przekierowanie 1 i 2: >word 2>&1 Uwaga: >word 2>&1 2>&1 >word Operatory przekierowania (z zastrzeżeniem powyższej uwagi) mogą pojawić się w dowolnym miejscu linii polecenia, np.: > > ls.txt man ls (C) Mariusz Kopeć, WEiP AGH, 2015 69 bash - przekierowania „here document”: > polecenie < (C) Mariusz Kopeć, WEiP AGH, 2015 70 bash - przekierowania Znak ’-’ może być ogranicznikiem, jeżeli nie jest dosunięty do operatora przekierowania: > cat << - > 1 linia tekstu > - 1 linia tekstu Znak ’-’ dosunięty do operatora daje osobny operator ’<<-’, którego działanie umożliwia wprowadzanie końcowego ogranicznika poprzedzonego znakami tabulacji: > cat <<- moj_ogr > 1 linia tekstu > moj_ogr 1 linia tekstu (C) Mariusz Kopeć, WEiP AGH, 2015 71 bash - przekierowania Jeżeli ogranicznik jest ujęty w apostrofy, to wprowadzane linie nie są rozwijane; w przeciwnym razie podlegają one rozwinięciu para- metrów, rozwinięciu arytmetycznemu i podstawieniu poleceń: > cat <<’moj_ogr’ > cat < (C) Mariusz Kopeć, WEiP AGH, 2015 72 bash - listy Lista – sekwencja poleceń (potoków) oddzielonych separatorami: ; & && || polecenie1 & polecenie2 polecenie1 wykonywane jest asynchronicznie (w tle) polecenie1 ; polecenie2 polecenie1 i polecenie2 wykonywane są sekwencyjnie polecenie1 && polecenie2 polecenie2 wykonywane jest tylko wtedy, gdy polecenie1 zwróci status 0 (zakończy się sukcesem) polecenie1 || polecenie2 polecenie2 wykonywane jest tylko wtedy, gdy polecenie1 zwróci status 0 (zakończy się błędem) (C) Mariusz Kopeć, WEiP AGH, 2015 73 bash – grupowanie poleceń Grupowanie poleceń – lista wykonywana jest jako osobna całość przekierowanie strumieni może wówczas dotyczyć całej grupy (lista) tworzona jest podpowłoka w której lista jest wykonywana > (mkdir Test; cd Test) > pwd /home/prac/mariusz { lista; } lista jest wykonywana w bieżącej powłoce > { mkdir Test; cd Test; } > pwd /home/prac/mariusz/Test (C) Mariusz Kopeć, WEiP AGH, 2015 74 bash - test Polecenie test Zwraca wynik wyrażenia testującego test [wartość1] operator wartość2 albo [ [wartość1] operator wartość2] porównania liczbowe -gt większy od -lt mniejszy od -eq równy -ge większy lub równy -le mniejszy lub równy -ne różny od (C) Mariusz Kopeć, WEiP AGH, 2015 75 bash - test przykład: [ $zm –eq 1 ] zwraca 0 gdy wartość zmiennej ”zm” jest równa 1 wybrane operacje na plikach: -e plik plik istnieje -d plik plik istnieje i jest katalogiem -f plik plik istnieje i jest plikiem zwykłym -r plik plik istnieje i można go czytać -w plik plik istnieje i można do niego pisać -xplik istnieje i można go wykonać przykład: [ –f moj_plik ] zwraca 0 gdy ”moj_plik” istnieje i jest plikiem zwykłym (C) Mariusz Kopeć, WEiP AGH, 2015 76 bash - test wybrane operacje na tekstach (stringach): string string ma niezerową długość -z string string ma zerową długość string1=string2 stringi 1 i 2 są równe string1==string2 to samo co powyżej string1!=string2 stringi 1 i 2 nie są równe string1 string1>string2 string2 poprzedza leksykalnie string1 przykłady: [ $odp = ”tak”] zmienna ”odp” ma wartość ”tak” [ $zmienna ] ”zmienna” ma niezerową długość [ -z $zmienna ] ”zmienna” ma zerową długość (C) Mariusz Kopeć, WEiP AGH, 2015 77 bash - let Polecenie let Wykonuje operacje na wielkościach arytmetycznych let wyrażenie albo ((wyrażenie)) W wyrażeniach występują wartości lub zmienne numeryczne oraz operatory opisane w rozwinięciu arytmetycznym. Przykłady: > let n=n+1 > ((m=m+1)) > ((m>n)) (C) Mariusz Kopeć, WEiP AGH, 2015 78 bash - let Użyte zmienne nienumeryczne inicjowane są wartością 0 Odnosząc się do wartości zmiennej nie musimy poprzedzać jej znakiem ”$” > m=sto > unset m > ((m=m+1)) > ((m=m+1)) > echo $m > echo $m 1 1 W konstrukcji (( ... )) w wyrażeniach mogą występować spacje: > (( m = m + 1 )) ok W konstrukcji let wyrażenia ze spacjami muszą być ujęte w cudzysłowy: > let m=m+1 ok > let ”m = m + 1” ok > let m = m + 1 błąd (C) Mariusz Kopeć, WEiP AGH, 2015 79 bash - let W wyrażeniach można używać operatora przecinka: > unset m > (( m = m+2, m++, m*=3 )) > echo $m 1 Jeżeli ostatnie wyrażenie ma wartość równą 0, to let zwraca 1, a w przeciwnym razie zwraca 0 > (( m = m+2, m++, m = 0 )) > echo $? wypisuje kod powrotu 1 > (( m=2, m++, m*=2 )) > echo $? wypisuje kod powrotu 0 (C) Mariusz Kopeć, WEiP AGH, 2015 80 bash - pętle Konstrukcje pętli Uwaga: syntaktyczny ’;’ może być zastąpiony przez znak nowej linii (/Enter) until until polecenia_testujące; do polecenia_do_wykonania; done polecenia_do_wykonania wykonywane są tak długo, dopóki polecenia_testujące zwracają zerowy kod powrotu while while polecenia_testujące; do polecenia_do_wykonania; done polecenia_do_wykonania wykonywane są tak długo, dopóki polecenia_testujące zwracają niezerowy kod powrotu (C) Mariusz Kopeć, WEiP AGH, 2015 81 bash - pętle Przykłady pętli until > m=5 > until [ $m –eq 0 ]; do > let m=m-1 > echo –n ”$m ” > done 4 3 2 1 0 > m=5 > until ((m--=0)); do > echo –n ”$m ” > done 4 3 2 1 0 (C) Mariusz Kopeć, WEiP AGH, 2015 82 bash - pętle Przykłady pętli while > m=5 > while [ $m –gt 0 ]; do > let m=m-1 > echo –n ”$m ” > done 4 3 2 1 0 > m=5 > while ((m-->0)); do > echo –n ”$m ” > done 4 3 2 1 0 (C) Mariusz Kopeć, WEiP AGH, 2015 83 bash - pętle for for nazwa [in słowo ...]; do polecenia_do_wykonania; done słowo jest rozwijane; polecenia_do_wykonania wykonywane są tak długo, dopóki nazwa odpowiada kolejnym elementom rozwinięcia; jeżeli [in słowo ...] nie pojawia się, porównuje się nazwę z kolejnymi parametrami pozycyjnymi for (( wyr1; wyr2; wyr3 )); do polecenia_do_wykonania; done wyrażenia wyr1, wyr2, wyr3 są wyrażeniami arytmetycznymi, a działanie pętli jest takie jak w C (C) Mariusz Kopeć, WEiP AGH, 2015 84 bash - pętle Przykłady pętli for > for name in *.c; do > echo ”Nazwa pliku: $name” > done > for name; do > echo ”Kolejny parametr: $name” > done > for ((n=0; n<5; n++)); do > echo ”N=$n” > done (C) Mariusz Kopeć, WEiP AGH, 2015 85 bash – instrukcje warunkowe Konstrukcje warunkowe Uwaga: syntaktyczny ’;’ może być zastąpiony przez znak nowej linii (/Enter) if if polecenia_testujące; then polecenia_do_wykonania; [elif inne_polecenia_testujące; then inne_polecenia_do_wykonania;] [else polecenia_alternatywne;] fi w zależności od wyniku poleceń testujących wykonywane są odpowiednie zestawy poleceń (C) Mariusz Kopeć, WEiP AGH, 2015 86 bash – instrukcje warunkowe case case słowo in [ [(] wzór [| wzór] ... ) polecenia ;; ... esac jeżeli słowo znajduje się na liście wzorów, to wykonywane są polecenia Przykład case $swiatlo in czerwone ) echo ”STOP” ;; zielone ) echo ”JAZDA” ;; default ) echo ”CZEKAJ” ;; esac (C) Mariusz Kopeć, WEiP AGH, 2015 87 bash – parametry Parametry i zmienne powłoki parametry – przechowują wartość (nazwę, liczbę, ...) parametry pozycyjne: np. $1, $9, ${12} kolejne parametry z linii wywołania polecenia parametry specjalne: $0 – nazwa powłoki lub wykonywanego skryptu $* – wszystkie parametry pozycyjne razem $# – ilość parametrów pozycyjnych Przykład: > cat mtest echo ’$1=’$1’ $2=’$2’ $0=’$0’ $#=’$#’ $*=’$* > . mtest Moj test $1=Moj $2=test $0=bash $#=2 $*=Moj test (C) Mariusz Kopeć, WEiP AGH, 2015 88 bash - zmienne zmienne – nazwane parametry przypisanie zmiennej wartości: zmienna1=wartość podczas przypisania dokonywane są wszystkie konieczne rozwinięcia do wartości zmiennej odwołujemy się następująco: $zmienna1 Przykład 1: Przykład 2: > zmienna1=~ > i=5 > echo $zmienna1 > j=$i+2 > /home/prac/mariusz > echo $((j)) 7 (C) Mariusz Kopeć, WEiP AGH, 2015 89 bash – zmienne powłoki zmienne powłoki (automatycznie ustawiane) zmienne powłoki sh (są też w bash): HOME katalog domowy użytkownika IFS lista znaków-separatorów pól PATH lista katalogów, w których powłoka szuka programów do wykonania PS1 podstawowy znak zachęty powłoki (default: ’\s-\v\$’) PS2 drugi znak zachęty powłoki (default: ’> ’) Jak odczytać ich wartości? Na przykład: > echo $PATH (C) Mariusz Kopeć, WEiP AGH, 2015 90 bash – zmienne powłoki zmienne powłoki bash (w sh ich nie było): BASH_VERSION numer wersji wykonywanej powłoki bash HISTSIZE max. liczba pamiętanych poleceń (d: 500) HOSTNAME nazwa hosta HOSTTYPE typ maszyny MACHTYPE typ maszyny PROMPT_COMMAND polecenie wykonywane przed wypisaniem $PS1 PWD bieżący katalog UID identyfikator użytkownika (C) Mariusz Kopeć, WEiP AGH, 2015 91 bash – wykonywanie poleceń Jak powłoka znajduje polecenia do wykonania? 1. Jeżeli nazwa polecenia zawiera ’/’ to polecenie traktowane jest jako program i wykonywane we własnym środowisku. 2. Jeżeli nie, to wykonywana jest funkcja powłoki o tej nazwie (o ile istnieje). Wykonanie następuje w środowisku powłoki. 3. Jeżeli takiej funkcji nie ma, to wykonywane jest polecenie wbudowane powłoki (builtin) o tej nazwie. Wykonanie następuje w środowisku powłoki. 4. Jeżeli takiego polecenia nie ma, to program o podanej nazwie poszukiwany jest w katalogach podanych w PATH. Wykonanie następuje w osobnym środowisku. 5. Jeżeli znaleziony plik nie jest w formacie wykonywalnym, to traktowany jest jako skrypt powłoki. (C) Mariusz Kopeć, WEiP AGH, 2015 92 bash – funkcje powłoki Funkcje powłoki grupują polecenia do późniejszego wykonania [function] nazwa () { lista polecen; } Przykład: > moja_funkcja () { > echo To jest moja funkcja > ls > ls –l | wc –l; } > moja_funkcja To jest moja funkcja ls.txt plik1.txt plik2.txt 3 (C) Mariusz Kopeć, WEiP AGH, 2015 93 bash – polecenia wbudowane Polecenia wbudowane powłoki sh . polecenie [argumenty] wykonuje polecenie (program) w bieżącym środowisku cd [nazwa katalogu] zmienia bieżący katalog pwd [nazwa katalogu] wypisuje nazwę bieżącego katalogu exit [n] kończy pracę powłoki zwracając kod wyjścia n export [nazwa[=wartość]] przekazuje wielkość określoną przez nazwę (zmienną, funkcję powłoki) do środowisk procesów potomnych; jeżeli nazwy nie podano wypisuje eksportowane wielkości (C) Mariusz Kopeć, WEiP AGH, 2015 94 bash – polecnia wbudowane return [n] wyjście z funkcji powłoki z kodem n shift [n] przesunięcie parametrów pozycyjnych o n pozycji test wyrażenie lub [ wyrażenie ] zwraca wynik opracowania wyrażenia set [ -opcje ] [ -o opcje] [ argumenty ] ustawia lub kasuje atrybutu powłoki; set pokazuje zmienne unset [nazwa] usuwa ustawione wcześniej zmienne lub funkcje powłoki (C) Mariusz Kopeć, WEiP AGH, 2015 95 bash – polecenia wbudowane Polecenia wbudowane powłoki bash alias [nazwa[=wartość]] ustawia lub wypisuje aliasy unalias [nazwa] usuwa aliasy declare [nazwa[=wartość]] deklaruje zmienne i nadaje im wartość; wypisuje zmienne echo [argumenty] wypisuje argumenty oddzielając je blankami i kończąc \n enable [-n] [-p] [polecenie wbudowane] uaktywnia/deaktywuje/wypisuje polecenia wbudowane (C) Mariusz Kopeć, WEiP AGH, 2015 96 bash – polecenia wbudowane let wyrażenie [wyrażenie] wykonuje wyrażenie arytmetyczne logout [n] wyjście z powłoki logowania z kodem powrotu n printf format [argumenty] wypisuje argumenty zgodnie z formatem read [opcje] [nazwa ...] wczytuje linię ze standardowego wejścia type [nazwa] wskazuje jak interpretowana będzie nazwa jeśli zostanie podana jako nazwa polecenia (C) Mariusz Kopeć, WEiP AGH, 2015 97 bash – polecenia wbudowane shopt [opcje] wypisuje albo przełącza atrybuty powłoki ulimit [opcje] [limit] pokazuje albo ustawia limity powłoki help wyświetla informacje o poleceniach powłoki pushd katalog przechodzi do katalogu i zapisuje go na stosie popd zdejmuje nazwę katalogu ze stosu i wykonuje do niego cd dirs wypisuje stos katalogów (C) Mariusz Kopeć, WEiP AGH, 2015 98 bash – sterowanie procesami Polecenia sterowania procesami powłoki bash suspend (ctrl Z) zatrzymuje wykonanie procesu jobs wypisuje aktywne procesy bg nr_procesu np. %1 kontynuacja realizacji zatrzymanego procesu w tle ( jak &) fg nr_procesu np. %1 kontynuacja realizacji zatrzymanego kill [-s sygnał] nr_procesu lub pid przesyła sygnał do procesu (C) Mariusz Kopeć, WEiP AGH, 2015 99 bash - przykłady Przykłady rozwinięcia linii polecenia: > echo ls p*.txt ls p1.txt pl1.txt pl2.txt plik1.txt plik2.txt p*.txt zastępowane jest odpowiednią listą plików > echo ls p{l,lik}*.txt ls pl1.txt pl2.txt plik1.txt plik2.txt rozwinięcie następuje w dwóch krokach: p{l,lik}*.txt -> pl*.txt plik*.txt -> ... > echo cat `whoami` ~ $((2+3)) {a,b}c p?.txt cat mariusz /home/prac/mariusz 5 ac bc p1.txt p2.txt przeprowadzane są wszystkie konieczne rozwinięcia (C) Mariusz Kopeć, WEiP AGH, 2015 100 bash - skrypty Skrypty skrypt – sekwencja poleceń wykonywana przez interpreter (powłokę), zapisana jako samodzielny plik. wykonanie skryptu: bash plik_skryptu skrypt jest wykonywany w nowym otoczeniu . plik_skryptu skrypt jest wykonywany w bieżącym otoczeniu ./plik_skryptu skrypt jest wykonywany w nowym otoczeniu. Uwaga: plik_skryptu musi mieć mod pozwalający na wykonanie (C) Mariusz Kopeć, WEiP AGH, 2015 101 bash - skrypty ustalenie programu wykonującego skrypt - w pierwszej linii skryptu podawana jest nazwa programu wraz z pełną ścieżką dostępu: #!/bin/bash skrypt wykonany będzie przez bash #!/bin/csh skrypt wykonany będzie przez csh #!/bin/tcsh skrypt wykonany będzie przez tcsh mogą być też inne programy: #!/bin/sed -f skrypt wykonany będzie przez sed #!/usr/bin/perl skrypt wykonany będzie przez perl #!/usr/bin/less skrypt wykonany będzie przez less (C) Mariusz Kopeć, WEiP AGH, 2015 102 bash - skrypty Przykłady skryptów Skrypt z pętlą while, wypisujący ostatni podany parametr: #!/bin/bash parametry=”” while [ $# -gt 1 ]; do parametry=”$parametry $1” shift done ostatni_parametr=$1 shift echo $parametry echo $ostatni_parametr (C) Mariusz Kopeć, WEiP AGH, 2015 103 bash - skrypty Skrypt z konstrukcją warunkową if #!/bin/bash echo "Pytamy o plik $1" if [ -e $1 ]; then echo "Plik $1 istnieje"; if [ -d $1 ]; then echo "Plik $1 jest katalogiem"; else echo "Plik $1 nie jest katalogiem"; fi else echo "Plik $1 nie istnieje"; fi (C) Mariusz Kopeć, WEiP AGH, 2015 104 bash - skrypty Skrypt z pętlą for #!/bin/bash echo Rozwiniecie nazw plikow: * for ff in *; do if file $ff | grep text > /dev/null; then echo "Plik $ff jest plikiem tekstowym" fi done Skrypt wypisuje nazwy plików z bieżącego katalogu i informuje czy dany plik jest plikiem tekstowym Skrypt ten jest wywoływany bez parametrów (C) Mariusz Kopeć, WEiP AGH, 2015 105 bash - skrypty Skrypt z pętlą while i konstrukcją case #!/bin/bash while true; do echo –n ”Wypisac biezacy katalog? (y/n) ” read yn case $yn in y* | Y* ) ls –l . ; break ;; [nN]* ) echo ”pomijamy” ; break ;; q* ) exit ;; * ) echo ”Niezrozumiala odpowiedz” ;; esac done (C) Mariusz Kopeć, WEiP AGH, 2015 106 bash - skrypty Skrypt z obliczeniami arytmetycznymi #!/bin/bash a=0 b=0 c=0 d=0 while [ $a –le 4 ]; do echo $a $b $c $d a=$(($a + 1)) b=$((b + a)) d=$((c += a)) done W rozwinięciu arytmetycznym zmienna może być używana bez poprzedzającego znaku $ Wynikiem rozwinięcia arytmetycznego jest wartość w instrukcji przypisania (C) Mariusz Kopeć, WEiP AGH, 2015 107 bash - skrypty Skrypt zaw_kat wykorzystujący instrukcję pustą #!/bin/bash katalog=”$1” : ${katalog:=$HOME} echo ”Zawartosc katalogu $katalog:” ls –1 ”$katalog” Przykłady wykonania: > zaw_kat > Zawartosc katalogu /home/prac/mariusz ... > zaw_kat . > Zawartosc katalogu . ... (C) Mariusz Kopeć, WEiP AGH, 2015 108 bash –konfiguracja Podstawy konfiguracji powłoki Pliki konfiguracyjne dla login shell /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ~/.bash_logout Pliki konfiguracyjne dla non-login shell /etc/bashrc ~/.bashrc (C) Mariusz Kopeć, WEiP AGH, 2015 109 bash - konfiguracja Konfiguracja znaku zachęty PS1=’[\u@\h \w]\$’ znaczenie: \u nazwa użytkownika \h nazwa hosta \H pełna nazwa hosta (z domeną) \w bieżący katalog \s nazwa powłoki \t czas HH:MM:SS \A czas HH:MM \$ # dla roota, $ dla innych \! numer polecenia w zapisie historii \n newline \\ backslash (C) Mariusz Kopeć, WEiP AGH, 2015 110 bash – skróty klawiaturowe Niektóre przydatne kombinacje klawiszy edycja linii komend C-a przesunięcie kursora na początek linii C-e przesunięcie kursora na koniec linii C-l clear screen C-_ usuwanie wprowadzonych zmian (kolejne) A-r usunięcie wszystkich zmian poruszanie się po pliku historii A-< na początek pliku historii A-> na koniec pliku historii C-r szukanie wstecz w pliku historii C-s szukanie do przodu w pliku historii (C) Mariusz Kopeć, WEiP AGH, 2015 111 bash – skróty klawiaturowe uzupełnienia TAB uzupełnienia ogółem A-? wypisz możliwe uzupełnienia A-/ uzupełnienie nazwy pliku A-~ uzupełnienie nazwy użytkownika A-@ uzupełnienie nazwy hosta A-! uzupełnienie poleceń (C) Mariusz Kopeć, WEiP AGH, 2015 112 bash – historia poleceń Korzystanie z historii poleceń fc operuje na liście historii fc –l listuje ostatnio wykonane polecenia wraz z ich numerami z listy historii fc –l n1 n2 listuje polecenia o numerach od n1 do n2 fc n1 n2 wpisuje polecenia o numerach od n1 do n2 do edytora; po edycji polecenia są kolejno wykonywane. fc –s old=new wykonuje poprzednie polecenie po zastąpieniu old przez new (C) Mariusz Kopeć, WEiP AGH, 2015 113 bash – historia poleceń history operuje na liście i/lub pliku historii history [n] listuje [n] ostatnich pozycji z listy historii wraz z ich numerami; pozycje oznaczone ‘*’ zostały zmodyfikowane history -c kasuje listę historii history –d n kasuje pozycję n z listy historii history -a dołącza nowe pozycje (wprowadzone od początku bieżącej sesji bash) do pliku historii history -r wczytuje plik historii i dołącza jego zawartość do aktualnej listy historii (C) Mariusz Kopeć, WEiP AGH, 2015 114 bash – historia poleceń rozwinięcia historii !n linia n z listy historii !-n linia –n pozycji wstecz na liście historii !! poprzednia linia (to samo co ’!-1’) !string ostatnia linia zaczynająca się od string !?string ostatnia linia zawierająca string ^old^new^ powtarza ostatnie polecenie zastępując old przez new !n:p wypisuje linię n z listy historii, ale jej nie wykonuje (C) Mariusz Kopeć, WEiP AGH, 2015 115 Zarządzanie procesami Informacje o procesach top pokazuje aktywne procesy z czasie rzeczywistym Sterowanie zachowaniem programu: h lub ? help spacja odświeżenie ekranu f zmiana formatu wyświetlanych wyników n określenie ilości śledzonych procesów k przesłanie sygnału do procesu (kill) q quit (C) Mariusz Kopeć, WEiP AGH, 2015 116 Zarządzanie procesami 14:22:12 up 12 days, 4:55, 23 users, load average: 1.31, 1.21, 1.18 219 processes: 217 sleeping, 2 running, 0 zombie, 0 stopped CPU states: 0.4% user, 1.7% system, 49.8% nice, 48.7% idle Mem: 515152K total, 462184K used, 52912K free, 25800K buffers Swap: 536136K total, 126633K used, 463500K free, 228936K cache PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 29203 mariusz 12 0 1076 1076 748 R 1.7 0.2 0.45 top 1 root 8 0 468 424 424 S 0.0 0.0 0.15 init ... PRI: priorytet procesu RSS: wykorzystywana pamięć fizyczna STAT: status procesu (Running, Sleeping, Zombie, Traced/sTopped) %CPU: procentowe wykorzystanie czasu CPU %MEM: procentowe wykorzystanie pamięci (C) Mariusz Kopeć, WEiP AGH, 2015 117 Zarządzanie procesami ps pokazuje aktywne procesy ps –ef wypisuje wszystkie procesy w formacie pełnym ps –fu user wypisuje wszystkie procesy użytkownika user ps a wypisuje wszystkie procesy (w tym innych użytkowników) skojarzone z terminalami ps –fNu user wypisuje wszystkie procesy użytkowników innych niż user (zwykle root) ps –C nazwa wypisuje wszystkie procesy związane z poleceniem o podanej nazwie (C) Mariusz Kopeć, WEiP AGH, 2015 118 Zarządzanie procesami pstree pokazuje działające procesy w formie drzewa pstree –a pokazuje działające procesy wraz z odpowiednimi argumentami linii poleceń pstree –h zaznacza rozjaśnieniem bieżący proces oraz jego ’przodków’ pstree –p wypisuje dodatkowo PID procesów (C) Mariusz Kopeć, WEiP AGH, 2015 119 Zarządzanie procesami kill przesyła sygnały do procesów kill –l wypisuje numery i nazwy wszystkich sygnałow kill –l n wypisuje nazwę sygnału o numerze n kill pid ... przesyła sygnał TERM (terminate) do procesów o podanych identyfikatorach pid kill –n pid przesyła sygnał o numerze n do procesu o podanym identyfikatorze pid Przykład: > kill –9 1213 przesyła sygnał bezwarunkowego zakończenia procesu o pid 1213 (C) Mariusz Kopeć, WEiP AGH, 2015 120 Zarządzanie procesami sleep opóźnia rozpoczęcie następnego procesu o podany interwał czasu sleep n[smhd] proces ”nic nie robi” (ale działa) przez n sekund. Dodany modyfikator [smhd] zmienia jednostki czasu: s – sekundy m – minuty h – godziny d - dni Przykład: > sleep 5s; ls polecenie ls zostanie wykonane po 5 sek. (C) Mariusz Kopeć, WEiP AGH, 2015 121 Zarządzanie procesami at wykonuje polecenie wprowadzone ze standardowego wejścia w określonym czasie at TIME rozpoczyna wykonanie polecenia o czasie TIME at –m TIME rozpoczyna wykonanie polecenia o czasie TIME i wysyła mail po zakończeniu działania polecenia Przykłady określenia czasu: HH:MM 10am Jul 31 1am tomorrow now + 3 weeks (C) Mariusz Kopeć, WEiP AGH, 2015 122 Zarządzanie procesami atq wypisuje zadania użytkownika oczekujące na rozpoczęcie wykonania atrm nr usuwa zadanie o numerze nr z kolejki Przykład: > at –m now + 1 hour <<+ > ls –l > + job 352 at 2004-01-22 09:24 > atq 352 2004-01-22 09:24 a mariusz > atrm 352 (C) Mariusz Kopeć, WEiP AGH, 2015 123 Zarządzanie procesami batch rozpoczyna wykonanie zadania w tle kiedy obciążenie systemu na to pozwoli batch -m wysyła mail po zakończeniu zadania Przykład: > batch <<+ > ls –l > + job 353 at 2004-01-22 08:39 (C) Mariusz Kopeć, WEiP AGH, 2015 124 Zarządzanie procesami nohup wykonuje polecenie w sposób ”odporny na zawieszenia” nohup polec & wykonuje polecenie polec w tle, nawet jeśli polecenie to przesyła wyniki na wyjście standardowe lub diagnostyczne, które może zostać zamknięte (np. przez wylogowanie użytkownika) Uwaga: Wyjście kierowane jest na plik nohup.out lub $HOME/nohup.out Przykład: > nohup moj_program & (C) Mariusz Kopeć, WEiP AGH, 2015 125 Przestrzeń dyskowa Informacje o wykorzystaniu przestrzeni dyskowej du informuje o wykorzystaniu przestrzeni dyskowej du podaje dane dla bieżącego katalogu i jego podkatalogów du -a podaje dane dla wszystkich plików w bieżącym katalogu i jego podkatalogach du -s podaje tylko sumaryczne dane dla bieżącego katalogu i jego podkatalogów du -h podaje dane w kilo-, mega- i gigabajtach Przykład: > du –sh 1.5M . (C) Mariusz Kopeć, WEiP AGH, 2015 126 Przestrzeń dyskowa df pokazuje wykorzystanie zamontowanych systemów plików df -l pokazuje tylko lokalne systemy plików df -T wypisuje dodatkowo typy zamontowanych systemów plików df –t typ podaje tylko dane dla określonego typu systemu plików df –x typ podaje dane z wyłączeniem określonego typu systemu plików df -h podaje dane w kilo-, mega- i gigabajtach (C) Mariusz Kopeć, WEiP AGH, 2015 127 Przestrzeń dyskowa quota pokazuje wykorzystanie przestrzeni dyskowej oraz przyznane limity quota wypisuje dane dla bieżącego użytkownika quota –g wypisuje dane dla grup, do których należy bieżący użytkownik Przykład: > quota Disk quotas for user mariusz (uid 751): Filesystem blocks quota limit grace files quota limit grace /dev/sdb1 8 40960 50000 1 0 0 /dev/sdf1 39764 40960 50000 1099 0 0 (C) Mariusz Kopeć, WEiP AGH, 2015 128 AWK trochę dokładniej Uruchomienie AWK (GAWK) gawk ’program’ [plik_wejściowy] [...] > gawk ’BEGIN {print ”Hello World!”}’ > gawk ’{print}’ <<< ’Hello World!’ > gawk ’//’ <<< ’Hello World!’ > gawk <<< ’Hello World!’ To nie będzie działać! plik.awk: BEGIN {print ”Hello World!”} gawk -f plik_programu [plik_wejściowy] [...] > gawk –f plik.awk skrypt awk > #!/usr/bin/gawk -f > BEGIN {print ”Hello World!”} (C) Mariusz Kopeć, WEiP AGH, 2015 129 AWK trochę dokładniej Program AWK ciąg poleceń w układzie wzorzec {akcja} można pominąć wzorzec – akcja wykonywana dla wszystkich linii można pominąć akcję – akcja domyślna: print nie można pominąć jednocześnie akcji i wzorca można podawać ciąg poleceń separowanych znakami nowej linii: > gawk ’/time/ {print $1} > /size/ {print $2}’ plik_wejsciowy kontynuacja przez ’\’ działa nawet we wzorcach: > gawk ’/Dlugi wzorzec mozna\ > kontynuowac/ {print $0}’ plik_wejsciowy komentarz ’#’ działa do końca linii (C) Mariusz Kopeć, WEiP AGH, 2015 130 AWK zmienne specjalne zmienne specjalne: $0 wczytany rekord $n n-te pole rekordu NF liczba wczytanych pól NR liczba wczytanych rekordów FNR liczba rekordów wczytanych z bieżącego pliku FS separator pól RS separator rekordów OFS wyjściowy separator pól ORS wyjściowy separator rekordów FILENAME nazwa aktualnie przetwarzanego pliku ARGC liczba podanych parametrów pozycyjnych ARGV tablica parametrów pozycyjnych ENVIRON tablica przetrzymująca zmienne środowiskowe (C) Mariusz Kopeć, WEiP AGH, 2015 131 AWK operacje wejścia/wyjścia operacje wejścia: next przerywa obróbkę bieżącego rekordu i pobiera następny exit zatrzymuje przetwarzanie rekordów i przechodzi do END getline zm pobiera rekord i wstawia jego zawartość do zmiennej zm getline close(plik) zamyka plik – przy ponownym użyciu rekordy pobierane będą od początku pliku Uwaga: getline zwraca wartość 1 aż do napotkania końca pliku, kiedy zwraca 0 operacje wyjścia: print wypisuje cały rekord na standardowe wyjście print ”a” ”b” wypisuje ”a” i ”b” na standardowe wyjście print ”a”,”b” wypisuje ”a” i ”b” rozdzielone przez OFS print > plik wypisuje rekord do pliku plik printf(format, arg1...) wypisuje kolejne argumenty zgodnie z formatem (tak jak w języku C) (C) Mariusz Kopeć, WEiP AGH, 2015 132 AWK operacje na tekście operacje na tekście: length(str) zwraca liczbę znaków w str. Jeżeli nie podano argumentu, to zwraca liczbę znaków w $0; index(str1,str2) jeżeli str1 zawiera str2 to zwraca pozycję, na której go znaleziono. Jeżeli nie – zwraca 0; split(str,tab,zp) kopiuje pola ciągu str oddzielone znakami podziału zp do tablicy tab i zwraca liczbę jej elementów; substr(str,poz,dl) zwraca podciąg łańcucha str, zaczynający się na pozycji poz i o długości dl; match(str,wzór) poszukuje w ciągu str znaków pasujących do wzoru. Jeżeli je znajdzie – zwraca pozycję, jeżeli nie – zwraca 0; sub(wzór,zast,str) zamienia wzór na zast w ciągu str. Jeżeli str nie podano - przyjmuje $0; Zwraca ilość podstawień; gsub(wzór,zast,str) działa podobnie jak sub, ale globalnie: zamienia wszystkie wystąpienia, a nie tylko pierwsze; sprintf(format,arg...) działa podobnie jak printf, ale nie drukuje tylko zwraca utworzony ciąg; (C) Mariusz Kopeć, WEiP AGH, 2015 133 AWK operacje matematyczne operacje na tekście, cd: toupper(str) zamienia wszystkie litery w str na duże; tolower(str) zamienia wszystkie litery w str na małe; operatory matematyczne ++ -- inkrementacja, dekrementacja; ^ potęgowanie; * / % mnożenie, dzielenie, modulo; + - dodawanie, odejmowanie; = *= /= %= += -= operatory przypisania funkcje matematyczne int(x) zwraca część całkowitą x; sqrt(x) zwraca pierwiastek kwadratowy x; sin(x), cos(x) funkcje trygonometryczne; log(x), exp(x) logarytm i eksponenta; rand(), srand(liczba) generatory liczb pseudolosowych; (C) Mariusz Kopeć, WEiP AGH, 2015 134 AWK operatory operatory porównania == != równy, nierówny; > >= większy, większy lub równy; < <= mniejszy, mniejszy lub równy; operatory logiczne ! && || negacja, koniunkcja, alternatywa; operatory poszukiwania wzoru str ~ regex dopasowuje ciąg str do wyrażenia regularnego regex; zwraca prawdę, jeżeli ciąg zawiera się w polu; str !~ regex negacja dopasowania; zwraca prawdę, jeżeli ciąg nie zawiera się w polu; (C) Mariusz Kopeć, WEiP AGH, 2015 135 AWK wzory wzory specjalne BEGIN wykonuje operacje przed rozpoczęciem przetwarzania danych; END wykonuje operacje po zakończeniu przetwarzania danych; wzory zakresów war1,war2 odnosi się do zakresu linii zaczynającego się od linii spełniającej warunek war1, a kończącego się na linii spełniającej warunek war2; zmienne i tablice zmienne nie są deklarowane; są inicjowane wartością 0 lub ”” w zależności od kontekstu, w którym zostały użyte; tablice tablice asocjacyjne – indeksowane nie są liczbami tylko napisami; (C) Mariusz Kopeć, WEiP AGH, 2015 136 AWK wyrażenia regularne wyrażenia regularne \ odbiera specjalne znaczenie następnemu znakowi; ^ dopasowuje początek stringu (nie koniecznie linii); $ dopasowuje koniec stringu (nie koniecznie linii); . dowolny znak, włączając w to ’\n’; [...] lista znaków – dowolny znak z listy; [^...] lista znaków – dowolny znak spoza listy; | operator alternatywy; (...) operator grupowania; * zero lub więcej wystąpień poprzedniego znaku; + jedno lub więcej wystąpień poprzedniego znaku; (C) Mariusz Kopeć, WEiP AGH, 2015 137 AWK wyrażenia regularne wyrażenia regularne, cd ? zero lub jedno wystąpienie poprzedniego znaku; {n} powtórzenie poprzedniego wyrażenia n razy; {n,} powtórzenie co najmniej n razy; {,n} powtórzenie co najwyżej n razy; {m,n} powtórzenie od m do n razy; \w litera, cyfra lub ’_’; \W nie \w; \< pusty string na początku słowa; \> pusty string na końcu słowa; \B niepusty string na krawędzi słowa; (C) Mariusz Kopeć, WEiP AGH, 2015 138 AWK instrukcje instrukcja warunkowa if if (warunek) instrukcja else instrukcja Przykłady: if (x % 2 == 0) print ”x jest parzyste” else print ”x jest nieparzyste” if (x % 2 == 0) print ”parzyste”; else print ”nieparzyste” if (x % 2 == 0) { print ”parzyste” print ”OK” } else print ”nieparzyste” (C) Mariusz Kopeć, WEiP AGH, 2015 139 AWK instrukcje instrukcja while while (warunek) instrukcje Przykład: awk ’{ i = 1 while (i <= 3) { print $i i++ } }’ plik_wejsciowy Uwaga: przejścia do nowych linii nie są tu konieczne, (z wyjątkiem ciała instrukcji złożonej) ale zalecane (C) Mariusz Kopeć, WEiP AGH, 2015 140 AWK instrukcje instrukcja do while do instrukcje while (warunek) Przykład: awk ’{ i = 1 do { print $0 i++ } while (i <= 10) }’ plik_wejsciowy Uwaga: przejścia do nowych linii nie są tu konieczne, (z wyjątkiem ciała instrukcji złożonej) ale zalecane (C) Mariusz Kopeć, WEiP AGH, 2015 141 AWK instrukcje instrukcja for for (inicjalizacja; warunek; inkrementacja) Przykład: gawk ’{ for (i = 1; i <= 3; i++) print $i (i <= 10) }’ plik_wejsciowy for (index in tablica) index przyjmuje wartości kolejnych indeksów w tablicy Przykład: gawk ’BEGIN {t[”jeden”]=1; t[”dwa”]=2; t[”trzy”]=3 for (i in t) print i,t[i] }’ (C) Mariusz Kopeć, WEiP AGH, 2015 142 AWK instrukcje instrukcja switch switch (wyrażenie) { case wartość lub regex: instrukcje default: instrukcje } Uwagi: wyrażenie dopasowywane może być do wartości numerycznej, stringu lub wyrażenia regularnego wykonanie instrukcji jest przerywane dopiero po napotkaniu: - końca instrukcji switch - jednej z instrukcji: break, continue, next, nextfile, exit (C) Mariusz Kopeć, WEiP AGH, 2015 143 AWK instrukcje instrukcja switch, cd Przykład: switch (NR * 2 + 1) { case 3: case ”11”: print NR – 1 break case /2[[:digit:]]+/: print NR default: print NR + 1 case –1: print NR * -1 } (C) Mariusz Kopeć, WEiP AGH, 2015 144 AWK instrukcje instrukcja break break Przerywa wykonanie najbardziej wewnętrznej pętli Poza pętlami traktowana jest jako błąd (POSIX) Przykład: { n = $1 for (d=2; d*d<=n; d++) if (n%d == 0) break if (n%d == 0) printf ”Najmniejszym podzieln. %d jest %d\n”,n,d else printf ”%d to liczba pierwsza\n”,n } (C) Mariusz Kopeć, WEiP AGH, 2015 145 AWK instrukcje instrukcja continue continue Przerywa bieżący przebieg pętli i przechodzi do następnego Poza pętlami traktowana jest jako błąd (POSIX) Przykład: BEGIN { for (x=0; x<=20; x++) { if (x == 5) continue printf ”%d ”,x } print ”” } (C) Mariusz Kopeć, WEiP AGH, 2015 146 AWK instrukcje instrukcja next next Przerywa przetwarzanie bieżącego rekordu i przechodzi do następnego; dalsza część akcji (w przeciwieństwie do skutku funkcji getline) nie jest realizowana Przykład: NF != 4 { err = sprintf(”%s:%d:NF != 4\n”,FILENAME,FNR) print err > ”/dev/stderr” next } Przetwarzanie rekordu zawierającego liczbę pól inną niż 4 zostanie przerwane, a na wyjście diagnostyczne wysłany zostanie komunikat o błędzie (C) Mariusz Kopeć, WEiP AGH, 2015 147 AWK instrukcje instrukcja nextfile (w gawk) nextfile Przerywa przetwarzanie bieżącego pliku i przechodzi do następnego podanego w linii polecenia Zmienia wartość zmiennej FILENAME, tak by odpowiadała nazwie kolejnego pliku Ustawia wartość zmiennej FNR=1 Przykład: NF != 4 { print ”%s nie ma 4 pol w rekordzie”,FILENAME nextfile } { akcje dla pliku o 4 polach w rekordzie } (C) Mariusz Kopeć, WEiP AGH, 2015 148 AWK instrukcje instrukcja exit exit [kod powrotu] Przerywa przetwarzanie: - wykonane w bloku BEGIN lub po nim – przejście do bloku END - wykonane w bloku END – zakończenie przetwarzania Przykład: BEGIN { print ”Jestem w bloku BEGIN”; exit } NF == 6 { n++ } END { print ”Znaleziono”,n,”rekordow” } Program zostanie wykonany bez przetwarzania pliku wejściowego! (C) Mariusz Kopeć, WEiP AGH, 2015 149 AWK tablice tablice asocjacyjne – indeksowane stringami, np.: tab[”jeden”]=1 tab[”dwa”]=2 indeks w postaci numerycznej zamieniany jest na string, np.: tab[17] tab[021] tab[0x11] sprawdzenie, czy ind jest jednym z indeksów tablicy tab: ind in tab na przykład: if (ind in tab) usuwanie elementów tablicy: delete tab[i] usuwanie całej tablicy (gawk): delete tab Uwaga: usunięcie tablicy nie zmienia jej typu, tzn. jej nazwa nie może być dalej używana jako nazwa zwykłej zmiennej (C) Mariusz Kopeć, WEiP AGH, 2015 150 AWK sortowanie tablic sortowanie po wartościach – asort asort(tab) - zwraca liczbę elementów tablicy i indeksuje ją na nowo liczbami od 1 do n, sortując wg. wartości jej elementów asort(tab,cpy) - kopiuje tab do cpy, i działa dalej tak jak asort(cpy); tab pozostaje nienaruszone Przykład: BEGIN { tab[”jeden”]=”one” tab[”dwa”]=”two” tab[”trzy”]=”three” n = asort(tab,cpy) for (i in tab) print i,tab[i] for (i in cpy) print i,cpy[i] } (C) Mariusz Kopeć, WEiP AGH, 2015 151 AWK sortowanie tablic sortowanie po indeksach – asorti asorti(tab) - zwraca liczbę elementów tablicy i indeksuje ją na nowo liczbami od 1 do n, sortując wg. wartości jej indeksów asorti(tab,cpy) - kopiuje tab do cpy, i działa dalej tak jak asorti(cpy); tab pozostaje nienaruszone Przykład: BEGIN { tab[”jeden”]=”one” tab[”dwa”]=”two” tab[”trzy”]=”three” n = asorti(tab,cpy) for (i in tab) print i,tab[i] for (i in cpy) print i,cpy[i] } (C) Mariusz Kopeć, WEiP AGH, 2015 152 AWK funkcje użytkownika definiowanie funkcji użytkownika function nazwa(lista_parametrów) { ciało funkcji } lista parametrów zawiera argumenty oraz zmienne lokalne argumenty ustalane są na podstawie wywołania – pozostałe wielkości są zmiennymi lokalnymi zmienne lokalne są inicjowane stringami pustymi Przykład: function drukuj(m) { printf ”%6.3g\n”, m } (C) Mariusz Kopeć, WEiP AGH, 2015 153 AWK funkcje użytkownika zwracanie wartości przez funkcje return [wyrażenie] polecenie return zwraca wynik wyrażenia jeżeli wyrażenie nie zostało podane, to zwracana wartość jest nieokreślona jeżeli return nie zostało użyte, to przyjmowane jest automatycznie na końcu definicji funkcji, a zwracana wartość jest nieokreślona Przykład: function srednia(tab,n,suma) { for (i in tab) {n++; suma+=tab[i]} return suma/n } (C) Mariusz Kopeć, WEiP AGH, 2015 154 AWK string i liczba typ wartości zmiennej (tekstowy lub numeryczny) ustalany jest dynamicznie i zależy od kontekstu zmienne tekstowe użyte w operacjach arytmetycznych mają wartość liczbową 0, np.: zero = ”zero”; x = 5 + zero; print x 5 zmienne (i stałe) ustawione w wyrażeniach obok siebie traktowane są jako tekstowe i podlegają konkatenacji, np.: m = 1; n = 2; print m n ” ” (m n + 5) 12 17 zmienne (i stałe) numeryczne są zmiennoprzecinkowe: print 3/4 0.75 (C) Mariusz Kopeć, WEiP AGH, 2015 155 AWK komunikacja z procesami gawk pozwala na tworzenie dwukierunkowych łączy z innymi procesami: BEGIN { command = ”read line; ls –l $line” print ”/usr/games” |& command while (command |& getline results) print ”>”,results } niekoniecznie na tej samej maszynie: BEGIN { Service = ”/inet/tcp/0/origin” \ ”.ftj.agh.edu.pl/daytime” Service |& getline print $0 close (Service) } (C) Mariusz Kopeć, WEiP AGH, 2015 156 SED - uzupełnienia Przestrzeń wzorca (pattern space) dane wejściowe dla każdego polecenia; zazwyczaj (ale nie zawsze) kolejna linia tekstu; zmieniają ja polecenia: N, n, x, g, G; Polecenia # (comment) cała linia jest ignorowana d (delete) blokuje wypisanie linii na standardowe wyjście wykonanie startuje od początku skryptu D (delete the first part of the pattern space) usuwa wszystko aż do znaku ’\n’ z przestrzeni wzorca wykonanie startuje od początku skryptu z następną linią (C) Mariusz Kopeć, WEiP AGH, 2015 157 SED - polecenia n (next) do przestrzeni wzorca wpisywana jest zawartość następnej linii wykonywane będzie następne polecenie N (append Next line) do przestrzeni wzorca dopisywana jest zawartość następnej linii poprzedzona znakiem ’\n’ a\ (append) dodaje tekst za linią wskazaną przez adres, a jeśli go nie ma – za każdą przetwarzaną linią i\ (insert) dodaje tekst przed linią wskazaną przez adres, a jeśli go nie ma – przed każdą przetwarzaną linią c\ (change) zmienia bieżącą przestrzeń wzorca (linię) na tekst (C) Mariusz Kopeć, WEiP AGH, 2015 158 SED - polecenia Uwagi do poleceń a\, i\, c\ polecenie musi stać w osobnej linii (albo być oddzielone ’;’) liczba wstawianych linii nie jest ograniczona kolejne linie, z wyjątkiem ostatniej, oddzielane są przez ’\’, np.: a\ linia 1\ linia 2\ ... linia n wprowadzając kolejne linie w linii polecenia musimy stosować wielokrotne opcje ’-e’, np.: sed –e’/wzor/{;i\’ –e’Linia wstawiana przed wzorem’\ -e’a\’ –e’1. linia wstawiana za wzorem\’ \ -e’2. linia wstawiana za wzorem’ –e’}’ (C) Mariusz Kopeć, WEiP AGH, 2015 159 SED - polecenia s/RE/zastąpienie/[flagi] (substitute) w liniach wskazanych przez adresy (albo we wszystkich) tekst pasujący do wyrażenia regularnego RE zastępowany jest przez zastąpienie; znaki ’/’ mogą być zastąpione przez dowolne inne znaki; w zastąpieniu wprowadzany jest surowy tekst, z wyjątkiem: & - zastępuje cały tekst dopasowany do RE \n (gdzie n jest cyfrą) – zastępuje n-tą grupę \(...\) \c (gdzie c nie jest cyfrą) – oznacza znak ’c’ flagi: brak – dokonywane jest tylko jedno zastąpienie g – dokonywane są wszystkie zastąpienia (global) n (gdzie n jest cyfrą) – dokonywane jest tylko n-te zastąpienie p – wypisuje przestrzeń wzorca po skutecznym zastąpieniu Uwaga: jeżeli zastąpienie zostało dokonane, ustawiana jest flaga wykorzystywana przez polecenie test; (C) Mariusz Kopeć, WEiP AGH, 2015 160 SED - polecenia p (print) przesyła określone linie na standardowe wyjście P (print first part of the pattern space) wypisuje z przestrzeni wzorca wszystko, aż do pierwszego ’\n’ l (list) działa podobnie jak p, ale wypisuje niektóre znaki specjalne w formie \c (np. \n, \t) w file (write to file) wypisuje określone linie do pliku file r file (read from file) wstawia zawartość pliku file po określonej linii (C) Mariusz Kopeć, WEiP AGH, 2015 161 SED - polecenia h (hold pattern space) kopiuje przestrzeń wzorca do bufora, kasując jego zawartość H (hold pattern space - append) dodaje zawartość przestrzeni wzorca do końca bufora g (get) kopiuje zawartość bufora do przestrzeni wzorca, kasując jej dotychczasową zawartość G (get - append) dołącza zawartość bufora do przestrzeni wzorca x (exchange) wymienia zawartość bufora i przestrzeni wzorca (C) Mariusz Kopeć, WEiP AGH, 2015 162 SED - polecenia !polecenie (negacja) neguje specyfikację adresu polecenia {} (grupowanie) grupuje polecenia wykonywane dla określonej linii pierwsze polecenie może pojawić się zaraz po ’{’ ’}’ musi być w osobnej linii grupowanie może być zagnieżdżone :etykieta wstawia etykietę, do której mogą skakać polecenia branch i test betykieta (branch) wykonuje bezwarunkowy skok do etykiety jeżeli nie ma etykiety, skacze do końca skryptu (C) Mariusz Kopeć, WEiP AGH, 2015 163 SED - polecenia tetykieta (test) wykonuje skok do etykiety jeżeli polecenie substitute, działające na bieżącej przestrzeni adresowej ustawiło odpowiednią flagę flaga jest ustawiana po dokonanym podstawieniu flaga jest resetowana po wykonaniu instrukcji test flaga jest resetowana po wczytaniu nowej linii y/lista1/lista2 (translate) zamienia znaki listy1 odpowiednimi znakami listy2 listy 1 i 2 muszą być tej samej długości separatory ’/’ mogą być zastąpione innymi znakami = (number) wypisuje numer bieżącej linii q (quit) koniec działania sed (C) Mariusz Kopeć, WEiP AGH, 2015 164 SED – przykłady skryptów Zliczanie linii inputu #!/bin/sed –nf $= Emulacja polecenia head #!/bin/sed –f 10q Rozdzielanie linii tekstu pustymi liniami #!/bin/sed –f /^$/d;G Emulacja polecenia tail #!/bin/sed –f :a $q;N;11,$D;ba (C) Mariusz Kopeć, WEiP AGH, 2015 165 SED – przykłady skryptów Odwrócenie kolejności znaków w linii #!/bin/sed –f /./!b s/!/!!/g s/^/-!-/ s/$/-!-/ ta :a s/-!-\([^!]\|!!\)\(.*\)\([^!]\|!!\)-!-/\3-!-\2-!-\1/ ta s/-!-//g s/!!/!/g (C) Mariusz Kopeć, WEiP AGH, 2015 166 SED – przykłady skryptów Emulacja polecenia tac #!/bin/sed -nf 1{h;b;} G;h ${g;p} (C) Mariusz Kopeć, WEiP AGH, 2015 167