AWK je výkonný programovací jazyk založený na datech, jehož počátky sahají až do počátků Unixu. Původně byl vyvinut pro psaní „jednorázových“ programů, ale od té doby se vyvinul do plnohodnotného programovacího jazyka. AWK dostává své jméno podle iniciál svých autorů - Aho, Weinbergera a Kernighana. Příkaz awk v systému Linux a dalších systémech Unix vyvolá tlumočníka, který spouští skripty AWK. V nedávných systémech existuje několik implementací awk, například gawk (GNU awk), mawk (Minimal awk) a nawk (New awk). Chcete-li zvládnout awk, podívejte se na níže uvedené příklady.
Porozumění programům AWK
Programy napsané v awk se skládají z pravidel, která jsou jednoduše dvojicí vzorů a akcí. Vzory jsou seskupeny do složené závorky a akční část se spustí vždy, když awk najde texty, které odpovídají vzoru. Ačkoli byl awk vyvinut pro psaní jednorázových linek, zkušení uživatelé s ním mohou snadno psát složité skripty.
Programy AWK jsou velmi užitečné pro zpracování souborů ve velkém měřítku. Identifikuje textová pole pomocí speciálních znaků a oddělovačů. Nabízí také programovací konstrukce na vysoké úrovni, jako jsou pole a smyčky. Psaní robustních programů pomocí prostého awk je tedy velmi možné.
Praktické příklady příkazu awk v systému Linux
Správci obvykle používají awk k extrakci dat a vytváření zpráv společně s jinými typy manipulace se soubory. Níže jsme probrali awk podrobněji. Postupujte podle pokynů pečlivě a vyzkoušejte je ve svém terminálu pro úplné pochopení.
1. Tisk konkrétních polí z textového výstupu
Nejčastěji používané příkazy Linuxu zobrazují svůj výstup pomocí různých polí. Normálně používáme příkaz Linux cut pro extrahování konkrétního pole z těchto dat. Níže uvedený příkaz vám však ukazuje, jak to provést pomocí příkazu awk.
$ kdo | awk 'print $ 1'
Tento příkaz zobrazí pouze první pole z výstupu příkazu who. Takže jednoduše získáte uživatelská jména všech aktuálně přihlášených uživatelů. Tady, 1 $ představuje první pole. Musíte použít $ N pokud chcete extrahovat N-té pole.
2. Tisk více polí z textového výstupu
Tlumočník awk nám umožňuje tisknout libovolný počet polí, která chceme. Níže uvedené příklady nám ukazují, jak extrahovat první dvě pole z výstupu příkazu who.
$ kdo | awk 'print $ 1, $ 2'
Můžete také řídit pořadí výstupních polí. Následující příklad nejprve zobrazí druhý sloupec vytvořený příkazem who a poté první sloupec v druhém poli.
$ kdo | awk 'print $ 2, $ 1'
Jednoduše vynechejte parametry pole ($ N) pro zobrazení celých dat.
3. Použijte ZAČÍNAT příkazy
Příkaz BEGIN umožňuje uživatelům vytisknout na výstup některé známé informace. Obvykle se používá pro formátování výstupních dat generovaných awk. Syntaxe tohoto příkazu je uvedena níže.
ZAČNĚTE Akce AKCE
Akce, které tvoří sekci ZAČÁTEK, se vždy spustí. Pak awk přečte zbývající řádky jeden po druhém a uvidí, jestli je třeba něco udělat.
$ kdo | awk 'BEGIN print "User \ tFrom" print $ 1, $ 2'
Výše uvedený příkaz označí dvě výstupní pole extrahovaná z výstupu příkazu who.
4. Použijte příkazy KONEC
Můžete také použít příkaz KONEC, abyste se ujistili, že určité akce budou vždy provedeny na konci vaší operace. Jednoduše umístěte sekci KONEC po hlavní sadě akcí.
$ kdo | awk 'BEGIN print "User \ tFrom" print $ 1, $ 2 END print "--COMPLETED--"'
Výše uvedený příkaz připojí daný řetězec na konec výstupu.
5. Hledání pomocí vzorů
Velká část fungování awk zahrnuje porovnávání vzorů a regex. Jak jsme již diskutovali, awk hledá vzory v každém vstupním řádku a akci provede pouze při spuštění shody. Naše předchozí pravidla se skládala pouze z akcí. Níže jsme ilustrovali základy porovnávání vzorů pomocí příkazu awk v Linuxu.
$ kdo | awk '/ mary / print'
Tento příkaz uvidí, zda je uživatel mary aktuálně přihlášen nebo ne. Bude nalezen celý řádek, pokud bude nalezena shoda.
6. Extrahujte informace ze souborů
Příkaz awk pracuje se soubory velmi dobře a lze jej použít pro složité úlohy zpracování souborů. Následující příkaz ukazuje, jak awk zpracovává soubory.
$ awk '/ hello / print' / usr / share / dict / americko-anglický
Tento příkaz vyhledá vzor „ahoj“ v americko-anglickém slovníku. Je k dispozici na většině distribucí založených na Linuxu. V tomto souboru tedy můžete snadno vyzkoušet awk programy.
7. Přečtěte si skript AWK ze zdrojového souboru
Ačkoli je psaní jednorázových programů užitečné, můžete také psát velké programy pomocí awk úplně. Budete je chtít uložit a spustit program pomocí zdrojového souboru.
$ awk -f script-file $ awk --file script-file
The -F nebo -soubor Možnost nám umožňuje určit programový soubor. Ve skriptu však nemusíte používat uvozovky ("), protože linuxový shell nebude takto programový kód interpretovat.
8. Nastavte oddělovač vstupního pole
Oddělovač polí je oddělovač, který rozděluje vstupní záznam. Můžeme snadno určit oddělovače polí awk pomocí -F nebo -oddělovač polí volba. Podívejte se na níže uvedené příkazy, abyste zjistili, jak to funguje.
$ echo "Toto je jednoduchý příklad" | awk -F - 'print $ 1' $ echo "This-is-a-simple-example" | awk --field-separator - 'print $ 1'
Funguje stejně, když používáte soubory skriptu namísto jednorázového příkazu awk v Linuxu.
9. Tisk informací podle stavu
O příkazu Linux cut jsme hovořili v předchozím průvodci. Nyní vám ukážeme, jak extrahovat informace pomocí awk pouze při splnění určitých kritérií. Budeme používat stejný testovací soubor, který jsme použili v této příručce. Takže jděte tam a pořiďte si kopii test.txt soubor.
$ awk '$ 4> 50' test.txt
Tento příkaz vytiskne z testu všechny národy.Soubor txt, který má více než 50 milionů obyvatel.
10. Tiskněte informace porovnáním regulárních výrazů
Následující příkaz awk zkontroluje, zda třetí pole libovolného řádku obsahuje vzor „Lira“, a vytiskne celý řádek, pokud je nalezena shoda. Znovu používáme test.Soubor txt používaný k ilustraci příkazu Linux cut. Než budete pokračovat, ujistěte se, že máte tento soubor.
$ awk '$ 3 ~ / Lira /' test.txt
Můžete se rozhodnout vytisknout pouze konkrétní část jakékoli shody, pokud chcete.
11. Spočítejte celkový počet řádků na vstupu
Příkaz awk má mnoho speciálních proměnných, které nám umožňují snadno provádět mnoho pokročilých věcí. Jednou takovou proměnnou je NR, která obsahuje číslo aktuálního řádku.
$ awk 'END print NR' test.txt
Tento příkaz vygeneruje, kolik řádků je v našem testu.soubor txt. Nejprve iteruje přes každý řádek a jakmile dosáhne END, vytiskne hodnotu NR - která v tomto případě obsahuje celkový počet řádků.
12. Nastavte oddělovač výstupního pole
Dříve jsme si ukázali, jak vybrat oddělovače vstupních polí pomocí -F nebo -oddělovač polí volba. Příkaz awk nám také umožňuje určit oddělovač výstupního pole. Níže uvedený příklad to ukazuje na praktickém příkladu.
$ datum | awk 'OFS = "-" tisk 2 $, 3 $, 6 $'
Tento příkaz vytiskne aktuální datum ve formátu dd-mm-rr. Spusťte datový program bez awk a podívejte se, jak vypadá výchozí výstup.
13. Použití If Construct
Stejně jako ostatní populární programovací jazyky poskytuje awk uživatelům také konstrukce if-else. Příkaz if v awk má níže uvedenou syntaxi.
if (výraz) first_action second_action
Odpovídající akce se provádějí, pouze pokud je podmíněný výraz true. Níže uvedený příklad to ukazuje pomocí našeho referenčního souboru test.txt.
$ awk 'if ($ 4> 100) print' test.txt
Odsazení nemusíte striktně udržovat.
14. Používání konstrukcí If-Else
Pomocí níže uvedené syntaxe můžete vytvořit užitečné žebříčky if-else. Jsou užitečné při vytváření složitých awk skriptů, které se zabývají dynamickými daty.
if (výraz) first_action else second_action
$ awk 'if ($ 4> 100) tisk; else print 'test.txt
Výše uvedený příkaz vytiskne celý referenční soubor, protože čtvrté pole není větší než 100 pro každý řádek.
15. Nastavte šířku pole
Někdy jsou vstupní data velmi chaotická a uživatelé mohou mít potíže s vizualizací ve svých sestavách. Naštěstí awk poskytuje výkonnou vestavěnou proměnnou s názvem FIELDWIDTHS, která nám umožňuje definovat seznam šířek oddělených mezerami.
$ echo 5675784464657 | awk 'BEGIN FIELDWIDTHS = "3 4 5" tisk $ 1, $ 2, $ 3'
Je to velmi užitečné při analýze rozptýlených dat, protože můžeme řídit šířku výstupního pole přesně tak, jak chceme.
16. Nastavte oddělovač záznamů
RS nebo Record Separator je další vestavěná proměnná, která nám umožňuje určit, jak jsou záznamy odděleny. Nejprve vytvořme soubor, který předvede fungování této proměnné awk.
$ kočka nová.txt Melinda James 23 New Hampshire (222) 466-1234 Daniel James 99 Phonenix Road (322) 677-3412
$ awk 'BEGIN FS = "\ n"; tisk $ 1, $ 3' nový.txt
Tento příkaz provede analýzu dokumentu a vyplivne jméno a adresu těchto dvou osob.
17. Proměnné prostředí tisku
Příkaz awk v Linuxu nám umožňuje snadno tisknout proměnné prostředí pomocí proměnné ENVIRON. Níže uvedený příkaz ukazuje, jak to použít pro tisk obsahu proměnné PATH.
$ awk 'BEGIN print ENVIRON ["PATH"]'
Obsah libovolných proměnných prostředí můžete vytisknout nahrazením argumentu proměnné ENVIRON. Níže uvedený příkaz vytiskne hodnotu proměnné prostředí HOME.
$ awk 'ZAČÍT tisknout ENVIRON ["HOME"]'
18. Vynechat některá pole z výstupu
Příkaz awk nám umožňuje z našeho výstupu vynechat konkrétní řádky. Následující příkaz to předvede pomocí našeho referenčního souboru test.txt.
$ awk -F ":" '$ 2 = ""; print 'test.txt
Tento příkaz vynechá druhý sloupec našeho souboru, který obsahuje název hlavního města pro každou zemi. Můžete také vynechat více než jedno pole, jak ukazuje následující příkaz.
$ awk -F ":" '$ 2 = ""; $ 3 = ""; tisk' test.txt
19. Odstraňte prázdné řádky
Data mohou někdy obsahovat příliš mnoho prázdných řádků. Pomocí příkazu awk můžete prázdné řádky snadno odstranit. Podívejte se na další příkaz a podívejte se, jak to funguje v praxi.
$ awk '/ ^ [\ t] * $ / next print' nové.txt
Ze souboru jsme odstranili všechny prázdné řádky nové.txt pomocí jednoduchého regulárního výrazu a vestavěného awk s názvem next.
20. Odstraňte koncové mezery
Výstup mnoha příkazů Linuxu obsahuje koncové mezery. Můžeme použít příkaz awk v Linuxu k odstranění takových mezer, jako jsou mezery a karty. Podívejte se na níže uvedený příkaz, abyste zjistili, jak řešit takové problémy pomocí awk.
$ awk 'sub (/ [\ t] * $ /, ""); tisk' nové.txt test.txt
Přidejte do našich referenčních souborů několik koncových mezer a ověřte, zda je awk úspěšně odstranil nebo ne. Udělal to úspěšně v mém stroji.
21. Zkontrolujte počet polí v každém řádku
Můžeme snadno zkontrolovat, kolik polí je v řádku pomocí jednoduché awk jednorázové. Existuje mnoho způsobů, jak toho dosáhnout, ale pro tento úkol použijeme některé vestavěné proměnné awk. Proměnná NR nám dává číslo řádku a proměnná NF počet polí.
$ awk 'print NR, "->", NF' test.txt
Nyní můžeme potvrdit, kolik polí je na řádku v našem test.txt dokument. Protože každý řádek tohoto souboru obsahuje 5 polí, jsme si jisti, že příkaz pracuje podle očekávání.
22. Ověřte aktuální název souboru
Proměnná awk FILENAME se používá k ověření aktuálního vstupního názvu souboru. Demonstrujeme, jak to funguje, na jednoduchém příkladu. Může to však být užitečné v situacích, kdy název souboru není znám explicitně nebo existuje více než jeden vstupní soubor.
$ awk 'print FILENAME' test.txt $ awk 'print FILENAME' test.txt nové.txt
Výše uvedené příkazy vytisknou název souboru awk, na kterém pracuje pokaždé, když zpracuje nový řádek vstupních souborů.
23. Ověřte počet zpracovaných záznamů
Následující příklad předvede, jak můžeme ověřit počet záznamů zpracovaných příkazem awk. Jelikož velký počet správců systému Linux používá awk pro generování zpráv, je pro ně velmi užitečné.
$ awk 'tisk "Zpracování záznamu -", NR; KONEC tisk "\ nCelkový počet zpracovaných záznamů:", NR;' test.txt
Tento úryvek awk často používám pro jasný přehled o mých akcích. Můžete jej snadno vyladit, aby vyhovoval novým nápadům nebo činům.
24. Vytiskněte celkový počet znaků v záznamu
Jazyk awk poskytuje užitečnou funkci zvanou length (), která nám říká, kolik znaků je v záznamu. Je to velmi užitečné v řadě scénářů. Rychle se podívejte na následující příklad, abyste zjistili, jak to funguje.
$ echo "Náhodný textový řetězec ..." | awk 'délka tisku ($ 0); '
$ awk 'délka tisku ($ 0); '/ etc / passwd
Výše uvedený příkaz vytiskne celkový počet znaků přítomných v každém řádku vstupního řetězce nebo souboru.
25. Vytiskněte všechny řádky delší než zadaná délka
K výše uvedenému příkazu můžeme přidat některé podmíněné výrazy a nechat ho tisknout pouze ty řádky, které jsou větší než předdefinovaná délka. Je užitečné, když už máte představu o délce konkrétního záznamu.
$ echo "Náhodný textový řetězec ..." | awk 'length ($ 0)> 10'
$ awk 'délka ($ 0)> 5; '/ etc / passwd
Můžete vložit více možností a / nebo argumentů pro vyladění příkazu na základě vašich požadavků.
26. Vytiskněte počet řádků, znaků a slov
Následující příkaz awk v systému Linux vytiskne počet řádků, znaků a slov v daném vstupu. Pro provádění této operace využívá proměnnou NR i základní aritmetiku.
$ echo "Toto je vstupní řádek ..." | awk 'w + = NF; c + = délka + 1 KONEC tisk NR, w, c '
Ukazuje, že ve vstupním řetězci je 1 řádek, 5 slov a přesně 24 znaků.
27. Vypočítejte frekvenci slov
Můžeme kombinovat asociativní pole a smyčku for v awk pro výpočet frekvence slova v dokumentu. Následující příkaz se může zdát trochu složitý, ale je poměrně jednoduchý, jakmile jasně pochopíte základní konstrukce.
$ awk 'BEGIN FS = "[^ a-zA-Z] +" pro (i = 1; i<=NF; i++) words[tolower($i)]++ END for (i in words) print i, words[i] ' test.txt
Pokud máte potíže s úryvkem jedné linky, zkopírujte následující kód do nového souboru a spusťte jej pomocí zdroje.
$ cat> frekvence.awk ZAČÍNÁ FS = "[^ a-zA-Z] +" pro (i = 1; i<=NF; i++) words[tolower($i)]++ END for (i in words) print i, words[i]
Pak jej spusťte pomocí -F volba.
$ awk -f frekvence.awk test.txt
28. Přejmenujte soubory pomocí AWK
Příkaz awk lze použít k přejmenování všech souborů odpovídajících určitým kritériím. Následující příkaz ukazuje, jak použít awk k přejmenování všech .Soubory MP3 v adresáři do .soubory MP3.
$ touch a, b, c, d, e.MP3 $ ls *.MP3 | awk 'printf ("mv \"% s \ ""\""% s \ ""\ n"", $ 0, tolower ($ 0))' $ ls *.MP3 | awk 'printf (""mv \""% s \ ""\""% s \ ""\ n"", $ 0, tolower ($ 0))' | sh
Nejprve jsme vytvořili několik demo souborů pomocí .Přípona MP3. Druhý příkaz ukazuje uživateli, co se stane, když je přejmenování úspěšné. Nakonec poslední příkaz provede operaci přejmenování pomocí příkazu mv v Linuxu.
29. Vytiskněte druhou odmocninu čísla
AWK nabízí několik vestavěných funkcí pro manipulaci s číslicemi. Jedním z nich je funkce sqrt (). Jedná se o funkci podobnou C, která vrací druhou odmocninu daného čísla. Rychle se podívejte na další příklad, abyste zjistili, jak to obecně funguje.
$ awk 'BEGIN print sqrt (36)