Úvod do Operačních Systémů – Přednáška 4
Regulární výrazy. Filtry grep, sed a awk.
Přednáška 4
1
●
●
●
●
grep [přepínače] vzor [soubory]
vypíše na standardní výstup řádky, které neobsahují zadaný vzor
vypíše pouze počet odpovídajících řádek
vypíše pouze jména souborů, které odpovídající řádky obsahují
vypíše odpovídající řádky a jejich pořadové číslo v souboru
-v
-c
-l
-n
Úvod do Operačních Systémů – Přednáška 4
nerozlišuje malá a velká písmena
-i
Název grep je zkratka pro skupinu příkazů editoru ex (globally search for regular expression and print result).
Podporuje znaky: ., *, ^, $, \<, \>,\, [, ], \{, \},
Vzor může být definován základním regulárním výrazem (man -s 5 regex).
Implicitně vypíše na standardní výstup řádky, které obsahují zadaný vzor.
grep
2
Úvod do Operačních Systémů – Přednáška 4
grep -v root /etc/group
grep root /etc/group
grep -l 'kill' /etc/init.d/*
grep -ni 'the' /etc/ssh/ssh_config
grep -ci 'the' /etc/ssh/ssh_config
grep -i 'The' /etc/ssh/ssh_config
grep 'the' /etc/ssh/ssh_config
grep 'The' /etc/ssh/ssh_config
Příklady
3
Symbol . znak* [ ] [^ ] ^ $ \< \> \znak
Úvod do Operačních Systémů – Přednáška 4
Význam jeden jakýkoliv znak žádný nebo libovolných počet výskytů předchozího znaku jeden znak z množiny/intervalu (např. [a,d,f], [a-h]) jeden libovolný znak mimo znaků z množiny/intervalu začátek řádky konec řádky začátek slova konec slova ruší speciální význam následujícího znaku 4
• Pro definování vzoru se používají speciální znaky, jejichž význam je jiný než u shellu (na příkazové řádce je musíme uvádět v apostrofech).
Regulární výrazy I
Úvod do Operačních Systémů – Přednáška 4
grep '^bag$' /usr/dict/words
grep 'bag$' /usr/dict/words
grep '^bag' /usr/dict/words
grep 'bag' /usr/dict/words
grep '\
' /etc/ssh/ssh_config
grep 'the' /etc/ssh/ssh_config
ypcat passwd | grep '/bin/ksh$'
ls -l | grep -c '^l'
Příklady
5
Úvod do Operačních Systémů – Přednáška 4
grep '^wood.*d$' /usr/dict/words
grep '^wood.*d' /usr/dict/words
grep '^wood' /usr/dict/words
grep '^woo*' /usr/dict/words
grep '^b.g$' /usr/dict/words
grep '^b[^aeiou]g' /usr/dict/words
grep '^b[aeiou]g' /usr/dict/words
Příklady
6
Význam právě m výskytů předchozího znaku nejméně m výskytů předchozího znaku m až n výskytů předchozího znaku
Úvod do Operačních Systémů – Přednáška 4
Příklady: grep '^[A-Z]' /usr/dict/words grep '^[A-Z][A-Z]' /usr/dict/words grep '^[A-Z]\{2\}' /usr/dict/words grep '^[A-Z]\{2,3\}' /usr/dict/words
Symbol znak\{m\} znak\{m,\} znak\{m,n\}
Regulární výrazy II
7
Přepínače jsou podobné jak u příkazu grep.
●
Úvod do Operačních Systémů – Přednáška 4
fgrep '^root' /etc/group
fgrep 'root' /etc/group
Příklady:
Příkaz je rychlejší než grep a egrep.
Vzor může být definován pouze jako obyčejný řetězec.
Implicitně vypíše na standardní výstup řádky, které obsahují zadaný vzor.
●
●
●
fgrep [přepínače] vzor [soubory]
fgrep
8
Úvod do Operačních Systémů – Přednáška 4
Přepínače jsou podobné jak u příkazu grep.
Navíc podporuje znaky: +, ?, |, (, )
●
●
Nepodporuje znaky: \(, \), \n, \<, \>, \{, \}
Vzor může být definován rozšířeným regulárním výrazem (man -s 5 regex).
Implicitně vypíše na standardní výstup řádky, které obsahují zadaný vzor.
●
●
●
egrep [přepínače] vzor [soubory]
egrep
9
Význam jeden nebo libovolných počet výskytů předchozího znaku žádný nebo jeden výskyt předchozího znaku RE1 nebo RE2 označení reg. podvýrazu
Úvod do Operačních Systémů – Přednáška 4
Příklady: egrep '^wo+' /usr/dict/words egrep '^wo?' /usr/dict/words egrep 'work(out|man|shop)‘/usr/dict/words
znak? RE1|RE2 (RE)
Symbol znak+
Regulární výrazy III
10
●
●
-f skript
-n
Úvod do Operačních Systémů – Přednáška 4
[adresa1 [,adresa2]] příkaz [parametry]
soubor skript musí obsahovat seznam příkazů:
11
(to co se má vytisknou musí být explicitně určeno příkazem p [print])
potlačí implicitní kopírování vstupu na výstup
Jednotlivé řádky jsou čteny ze standardního vstupu nebo ze souboru, provádí nad nimi jednotlivé příkazy a vypíší se na standardní výstup.
Stream editor - edituje neinteraktivně jeden nebo více souborů.
sed [přepínače] -f skript [soubory]
sed [přepínače]
sed I
Praha
Brno
Petra Farska Z
Pavel Kulik
Brno
Pavel Kulik
24000
27000
23000
22000
31
27
32
38
26
31
27
32
38
26
Úvod do Operačních Systémů – Přednáška 4
$ sed -n '' data.txt
M
Praha
Petra Farska Z
Brno
Plzen
Mala
Jitka
24000
27000
23000
22000
Praha 15000
Z
Prasek M
Jiri
M
Novak
Jan
$ sed '' data.txt
M
Plzen
Mala
Jitka
Brno
Praha 15000
Z
Prasek M
Jiri
M
Novak
Jan
$ cat data.txt
Příklady
12
●
vypíše řádku na výstup
p(print)
Úvod do Operačních Systémů – Přednáška 4
s/RE1/RE2/volby nahradí text, který odpovídá vzoru RE1, řetězcem RE2
zruší řádku
d(delete)
Příkazy
sed II
13
Praha
Petra Farska Z
27000
23000
22000
Brno
Pavel Kulik
24000
27000
31
27
27
32
38
Úvod do Operačních Systémů – Přednáška 4
M
Praha
Petra Farska Z
$ sed -n '4,$p' data.txt
Plzen
Mala
Jitka
Brno
Z
Prasek M
Jiri
$ sed -n '2,4p' data.txt
Příklady
14
'/^J/d' data.txt
$ sed 27 31
26 38 32
22000 23000 27000
38 32 27
Úvod do Operačních Systémů – Přednáška 4
Jiri Prasek M Brno Jitka Mala Z Plzen Petra Farska Z Praha
$ sed -n '/38$/,/27$/p' data.txt
Petra Farska Z Praha 27000 Pavel Kulik M Brno 24000
Novak M Praha 15000 Prasek M Brno 22000 Mala Z Plzen 23000
Jan Jiri Jitka
$ sed -n '/^J/p' data.txt
Příklady
15
Novak Prasek Mala Farska Kulik
M Louny 15000 M Brno 22000 Z Plzen 23000 Z Louny 27000 M Brno 24000
26 38 32 27 31
Jan Jiri Jitka Petra Pavel
M Praha M Brno Z Plzen Z Praha M Brno
15000 22000 23000 27000 24000
26 let 38 let 32 let 27 let 31 let
Úvod do Operačních Systémů – Přednáška 4
Novak Prasek Mala Farska Kulik
$ sed 's/[0-9][0-9]$/& let/' data.txt
Jan Jiri Jitka Petra Pavel
$ sed 's/Praha/Louny/' data.txt
Příklady
16
●
Úvod do Operačních Systémů – Přednáška 4
[vzor] [{ akce }]
Struktura příkazu programu:
17
Implicitním oddělovačem položek je mezera/tabelátor (lze změnit přepínačem –F nebo proměnnou FS).
Na řádku se pohlíží jako na posloupnost položek $1, $2,...,$NF ($0 = celá řádka).
●
●
Pokud není vzor specifikován, provede se program nad každou řádkou.
Jednotlivé řádky jsou čteny ze standardního vstupu nebo ze souboru, pokud odpovídají zadanému vzoru, provede se nad nimi příslušný program.
Původní verze se jmenovala awk, rozšířená verze pak nawk (na některých systémech lze rozšířenou verzi najít pod původním názvem awk) .
Programovatelný filtr vytvořený autory: Aho, Weinberger, Kernighan.
●
●
●
●
awk [přepínače] [program] [prom=hod...] [soubory]
awk a nawk I
po zpracováním poslední řádky ze vstupu pro řádky vyhovující danému výrazu od první řádky splňující výraz začátek až do první řádky splňující výraz konec
END
výraz
Úvod do Operačních Systémů – Přednáška 4
– regulární výraz (ve formátu pro egrep) – logický výraz (0 nebo prázdný řetězec = false, jinak true)
• Typy výrazů:
začátek,konec
Kdy se provede akce před zpracováním první řádky ze vstupu
Vzor BEGIN
• Typy vzorů:
awk a nawk II
18
●
●
●
relační operátory: >, >=, <, <=, ==, !=, ~, !~ (řetězec odpovídá/neodpovídá danému vzoru)
matematické operátory: +, -, *, /, %,^, ++, --
Logické operátory: &&, ||, !
●
●
●
použití je podobné jako v jazyce C
●
počet položek v aktuálním řádku
pořadová číslo aktuální řádky
vstupní oddělovač položek na řádce
výstupní oddělovač položek na řádce
NF
NR
FS
OFS
●
●
●
●
Úvod do Operačních Systémů – Přednáška 4
hodnota n-té položka z aktuálního řádku ( $0 = celá řádka )
$n
●
Některé předefinované proměnné
deklarují se použitím
●
Proměnné
tvořeny pomocí operátorů jako v jazyce C
●
Logické výrazy
awk a nawk III
19
%s\n", NR, $0) }' data.txt
Úvod do Operačních Systémů – Přednáška 4
$ nawk '{ printf("%d:
$ nawk '/^J/ { print $0 }' data.txt
$ ypcat passwd | nawk -F: '{print $3 , $1 , $5}'
$ nawk '{print $2 ”\t” $1}' data.txt
$ nawk '{print $2, $1}' data.txt
Příklady
20
26 38 32 27 31
Úvod do Operačních Systémů – Přednáška 4
$ nawk -f p1.awk data.txt Jan Novak M Praha 15000 Jiri Prasek M Brno 22000 Jitka Mala Z Plzen 23000 Petra Farska Z Praha 27000 Pavel Kulik M Brno 24000 -----------------------------------------Prumerny plat 22200
{ c=c+$5; print $0 } END { printf("------------------------------------------\n"); printf("Prumerny plat %d\n", c/NR) }
p1.awk
Příklady
21
●
●
{ příkazy }
# předčasné ukončení cyklu
Úvod do Operačních Systémů – Přednáška 4
continue # předčasné ukončení aktuální iterace cyklu
break
do { příkazy } while ( výraz )
while ( výraz )
for ( j in pole ) { příkazy }
for ( i=min; i<=max; i++ ) { příkazy }
Cykly
if (výraz) { příkazy1} [ else { příkazy2} ]
Podmíněný příkaz
awk a nawk IV
22
for (i=NF; i>=1; i--) { printf("%s\t", $i) } printf("\n")
22000 Brno
23000 Plzen Z
27000 Praha Z
24000 Brno
38
32
27
31
Jitka
Kulik Pavel
Farska Petra
Mala
Prasek Jiri
Novak Jan
Úvod do Operačních Systémů – Přednáška 4
M
M
15000 Praha M
26
$ nawk -f p2.awk data.txt
}
{
p2.awk
Příklady
23
●
Úvod do Operačních Systémů – Přednáška 4
tolower(), toupper(),...
length(), match(), split(), substr(), sub(),...
system()
sin(), sqrt(), log(), exp(),...
printf("řetězec" [,hodnoty])
Předefinované funkce
awk a nawk V
24