Ze všech linuxových příkazů (a je jich mnoho) se zdají tři nejpodstatnější sed
, awk
a grep
. Možná je to tajemným zvukem jejich jmen nebo šířkou jejich potenciálního využití nebo jen jejich věkem, ale když někdo uvádí příklad příkazu „Linuxy“, je to obvykle jeden z těchto tří. A zatímco sed
a grep
mají několik jednoduchých jednořádkových standardů, méně prestižní awk
zůstává trvale prominentní, protože je obzvláště matoucí.
Pravděpodobně použijete sed
pro rychlou výměnu řetězce nebo grep
pro každodenní filtrování vzoru. Je mnohem méně pravděpodobné, že vytvoříte awk
příkaz. Často se divím, proč tomu tak je, a přisuzuji to několika věcem. Za prvé, mnoho z nás téměř nepoužívá sed
a grep
pro cokoliv kromě nějaké variace na tyto dva příkazy:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Takže i když se můžete cítit pohodlněji s sed
a grep
, možná nevyužijete jejich plný potenciál. Samozřejmě neexistuje žádná povinnost dozvědět se více o sed
nebo grep
, ale někdy se divím, jak se "učím" příkazy. Místo učení jak příkaz funguje, často se naučím konkrétní zaklínadlo, které obsahuje příkaz. V důsledku toho často cítím falešnou obeznámenost s příkazem. Myslím, že znám příkaz, protože dokážu vyjmenovat tři nebo čtyři možnosti z hlavy, i když nevím, co tyto možnosti dělají, a nedokážu se přesně dotknout syntaxe.
A to je podle mého názoru problém, kterému čelí mnoho lidí, když jsou konfrontováni se silou a flexibilitou awk
.
Naučení awk používat awk
Základy awk
jsou překvapivě jednoduché. Často se uvádí, že awk
je programovací jazyk, a přestože jde o relativně základní jazyk, je to pravda. To znamená, že se můžete naučit awk
stejným způsobem, jakým se učíte nový kódovací jazyk:naučte se jeho syntaxi pomocí několika základních příkazů, naučte se jeho slovní zásobu, abyste mohli stavět na složité akce, a pak cvičte, cvičte, procvičujte.
Jak awk analyzuje vstup
Awk
vidí vstup v podstatě jako pole. Když awk
prohledá textový soubor, zachází s každým řádkem, jednotlivě a postupně, jako záznam . Každý záznam je rozdělen do polí . Samozřejmě, awk
musí tyto informace sledovat a můžete je zobrazit pomocí NR
(počet záznamů) a NF
(počet polí) vestavěné proměnné. Například získáte počet řádků souboru:
$ awk 'END { print NR;}' example.txt
36
To také prozrazuje něco o awk
syntax. Ať už píšete awk
jako jednořádkový nebo jako samostatný skript, struktura awk
instrukce je:
pattern or keyword { actions }
V tomto příkladu slovo END
je speciální, vyhrazené klíčové slovo spíše než vzor. Podobné klíčové slovo je BEGIN
. S oběma těmito klíčovými slovy awk
pouze provede akci ve složených závorkách na začátku nebo na konci analýzy dat.
Můžete použít vzor jako filtr nebo kvalifikátor, takže awk
provede danou akci pouze tehdy, když je schopen porovnat váš vzor s aktuálním záznamem. Předpokládejme například, že chcete použít awk
, stejně jako byste to udělali grep
, abyste našli slovo Linux v souboru textu:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
Pro awk
, každý řádek v souboru je záznam a každé slovo v záznamu je pole. Ve výchozím nastavení jsou pole oddělena mezerou. Můžete to změnit pomocí --field-separator
možnost, která nastavuje FS
(oddělovač polí) proměnná na cokoliv, co chcete, aby to bylo:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
V této ukázce je před každým záznamem prázdné místo, protože za každým dvojtečkou je prázdné místo (:
) ve zdrojovém textu. Toto není cut
, takže oddělovač polí nemusí být omezen na jeden znak:
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Funkce v awk
V awk
si můžete vytvořit své vlastní funkce pomocí této syntaxe:
name(parameters) { actions }
Funkce jsou důležité, protože vám umožňují napsat kód jednou a znovu jej použít během vaší práce. Při vytváření jednoduchých řádků jsou vlastní funkce o něco méně užitečné než ve skriptech, ale awk
již pro vás definuje mnoho funkcí. Fungují v zásadě stejně jako jakákoli funkce v jakémkoli jiném jazyce nebo tabulce:Naučíte se, v jakém pořadí funkce od vás potřebuje informace, a můžete do ní dávat, co chcete, abyste získali výsledky.
Existují funkce pro provádění matematických operací a zpracování řetězců. Ty matematické jsou často poměrně jednoduché. Zadáte číslo a ono to rozdrtí:
$ awk 'BEGIN { print sqrt(1764); }'
42
Řetězcové funkce mohou být složitější, ale jsou dobře zdokumentovány v příručce GNU awk. Například split
funkce přebírá entitu, která awk
pohledy jako jedno pole a rozdělí je na různé části. Vyžaduje pole, proměnnou, která se má použít jako pole obsahující každou část rozdělení, a znak, který chcete použít jako oddělovač.
Pomocí výstupu z předchozích příkladů vím, že na samém konci každého záznamu je IP adresa. V tomto případě mohu odeslat pouze poslední pole záznamu do split
funkce odkazem na proměnnou NF
protože obsahuje počet polí (a konečné pole musí být nejvyšší číslo):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
Existuje mnoho dalších funkcí a není důvod se omezovat na jednu na blok awk
kód. Pomocí awk
můžete vytvářet složité kanály ve vašem terminálu, nebo můžete napsat awk
skripty k definování a využití vašich vlastních funkcí.
Stáhněte si e-knihu
Učení awk
je většinou záležitostí použití awk
. Použijte jej, i když to znamená duplikování funkcí, které již máte s sed
nebo grep
nebo cut
nebo tr
nebo jakékoli jiné dokonale platné příkazy. Jakmile si s tím zvyknete, můžete psát funkce Bash, které vyvolají vaše vlastní awk
příkazy pro snadnější použití. A nakonec budete schopni psát skripty pro analýzu složitých datových sad.
Stáhněte si naše elektronická kniha se dozvíte vše, co potřebujete vědět o awk
a začněte jej používat ještě dnes.