Příkaz AWK v Unixu/Linuxu s příklady

Awk je skriptovací jazyk používaný pro manipulaci s daty a generování sestav. Příkazový programovací jazyk awk nevyžaduje žádnou kompilaci a umožňuje uživateli používat proměnné, numerické funkce, řetězcové funkce a logické operátory.

Awk je nástroj, který umožňuje programátorovi psát malé, ale účinné programy ve formě příkazů, které definují textové vzory, které se mají hledat v každém řádku dokumentu, a akci, která se má provést, když je nalezena shoda v dokumentu. čára. Awk se většinou používá pro skenování a zpracování vzorů. Prohledá jeden nebo více souborů, aby zjistil, zda obsahují řádky, které odpovídají zadaným vzorům, a poté provede související akce.

Awk je zkratka ze jmen vývojářů – Aho, Weinberger a Kernighan.

CO MŮŽEME DĚLAT S AWK?

1. Operace AWK:
(a) Prohledá soubor řádek po řádku
(b) Rozdělí každý vstupní řádek na pole
(c) Porovná vstupní řádek/pole se vzorem
(d) Provádí akce na shodných liniích

2. Užitečné pro:
(a) Transformujte datové soubory
(b) Vytvářejte formátované zprávy

3. Programovací konstrukce:
(a) Naformátujte výstupní řádky
(b) Aritmetické a řetězcové operace
(c) Podmínky a smyčky

Syntax:

awk options 'selection _criteria {action }' input-file>výstupní-soubor 

Možnosti:

-f program-file : Reads the AWK program source from the file program-file, instead of from the first command line argument. -F fs : Use fs for the input field separator 

Ukázkové příkazy

Příklad:

Zvažte následující textový soubor jako vstupní soubor pro všechny níže uvedené případy:

$cat>zamestnanec.txt 
ajay manager account 45000 sunil clerk account 25000 varun manager sales 50000 amit manager account 47000 tarun peon sales 15000 deepak clerk sales 23000 sunil peon sales 13000 satvik director purchase 80000 

1. Výchozí chování Awk: Ve výchozím nastavení Awk vytiskne každý řádek dat ze zadaného souboru.

$ awk '{print}' employee.txt 

Výstup:

ajay manager account 45000 sunil clerk account 25000 varun manager sales 50000 amit manager account 47000 tarun peon sales 15000 deepak clerk sales 23000 sunil peon sales 13000 satvik director purchase 80000 

Ve výše uvedeném příkladu není uveden žádný vzor. Takže akce jsou použitelné pro všechny řádky. Tisk akce bez jakéhokoli argumentu standardně vytiskne celý řádek, takže vytiskne všechny řádky souboru bez selhání.

2. Vytiskněte čáry, které odpovídají danému vzoru.

$ awk '/manager/ {print}' employee.txt 

Výstup:

ajay manager account 45000 varun manager sales 50000 amit manager account 47000 

Ve výše uvedeném příkladu příkaz awk vytiskne celý řádek, který se shoduje s ‚manager‘.

3. Rozdělení řádku na pole: Pro každý záznam, tj. řádek, příkaz awk rozdělí záznam standardně oddělený mezerou a uloží jej do proměnných $n. Pokud má řádek 4 slova, bude uložen v pořadí $1, $2, $3 a $4. Také $0 představuje celý řádek.

$ awk '{print $1,$4}' employee.txt 

Výstup:

ajay 45000 sunil 25000 varun 50000 amit 47000 tarun 15000 deepak 23000 sunil 13000 satvik 80000 

Ve výše uvedeném příkladu představuje $1 a $4 pole Jméno a Plat.

Vestavěné proměnné v Awk

Vestavěné proměnné Awk zahrnují proměnné pole – $1, $2, $3 atd. ($0 je celý řádek) – které rozdělují řádek textu na jednotlivá slova nebo části zvané pole.

    NR: Příkaz NR uchovává aktuální počet vstupních záznamů. Pamatujte, že záznamy jsou obvykle řádky. Příkaz Awk provede příkazy vzor/akce jednou pro každý záznam v souboru. NF: Příkaz NF uchovává počet polí v aktuálním vstupním záznamu. FS: Příkaz FS obsahuje znak oddělovače polí, který se používá k rozdělení polí na vstupním řádku. Výchozí hodnota je bílá mezera, což znamená mezeru a znaky tabulátoru. FS lze znovu přiřadit jinému znaku (obvykle v BEGIN), aby se změnil oddělovač pole. RS: Příkaz RS ukládá aktuální znak oddělovače záznamu. Protože je ve výchozím nastavení vstupním záznamem vstupní řádek, výchozím znakem oddělovače záznamu je nový řádek. OFS: Příkaz OFS ukládá oddělovač výstupních polí, který odděluje pole, když je Awk vytiskne. Výchozí nastavení je prázdné místo. Kdykoli má tisk několik parametrů oddělených čárkami, vypíše hodnotu OFS mezi každý parametr. ORS: Příkaz ORS ukládá oddělovač výstupních záznamů, který odděluje výstupní řádky, když je Awk vytiskne. Výchozí je znak nového řádku. print automaticky vytiskne obsah ORS na konci všeho, co je dáno k tisku.

Příklady:

Použití vestavěných proměnných NR (číslo řádku displeje)

$ awk '{print NR,$0}' employee.txt 

Výstup:

1 ajay manager account 45000 2 sunil clerk account 25000 3 varun manager sales 50000 4 amit manager account 47000 5 tarun peon sales 15000 6 deepak clerk sales 23000 7 sunil peon sales 13000 8 satvik director purchase 80000 

Ve výše uvedeném příkladu příkaz awk s NR vytiskne všechny řádky spolu s číslem řádku.

Použití vestavěných proměnných NF (Zobrazit poslední pole)

$ awk '{print $1,$NF}' employee.txt 

Výstup:

ajay 45000 sunil 25000 varun 50000 amit 47000 tarun 15000 deepak 23000 sunil 13000 satvik 80000 

Ve výše uvedeném příkladu $1 představuje jméno a $NF představuje plat. Plat můžeme získat pomocí $NF , kde $NF představuje poslední pole.

Další použití vestavěných proměnných NR (zobrazovací řádek od 3 do 6)

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt 

Výstup:

3 varun manager sales 50000 4 amit manager account 47000 5 tarun peon sales 15000 6 deepak clerk sales 23000 

Další příklady

Pro daný textový soubor:

$cat>geeksforgeeks.txt A B C Tarun A12 1 Muž B6 2 Praveen M42 3 

1) Chcete-li vytisknout první položku spolu s číslem řádku (NR) odděleným znakem – z každého řádku v souboru geeksforgeeks.txt:

$ awk '{print NR '- ' $1 }' geeksforgeeks.txt 
1 - A 2 - Tarun 3 – Manav 4 - Praveen 

2) Chcete-li vrátit druhý sloupec/položku z geeksforgeeks.txt:

Otázka by měla znít:- Chcete-li vrátit druhý sloupec/položku z geeksforgeeks.txt:

$ awk '{print $2}' geeksforgeeks.txt 
B A12 B6 M42 

3) Chcete-li vytisknout jakýkoli neprázdný řádek, pokud existuje

$ awk 'NF  <0' geeksforgeeks.txt 

zde NF by mělo být 0 ne menší než a uživatel musí také vytisknout číslo řádku:

správná odpověď: awk ‘NF == 0 {print NR}’ geeksforgeeks.txt

NEBO

awk ‘NF <= 0 {print NR}’ geeksforgeeks.txt

0 

4) Chcete-li zjistit délku nejdelšího řádku v souboru:

$ awk '{ if (length($0)>max) max = délka (0 $) } KONEC { tisk max. }' geeksforgeeks.txt 
13 

5) Chcete-li počítat řádky v souboru:

$ awk 'END { print NR }' geeksforgeeks.txt 
3 

6) Tisk řádků s více než 10 znaky:

$ awk 'length($0)>10' geeksforgeeks.txt 
Tarun A12 1 Praveen M42 3 

7) Chcete-li najít/zkontrolovat jakýkoli řetězec v jakémkoli konkrétním sloupci:

$ awk '{ if($3 == 'B6') print $0;}' geeksforgeeks.txt 

8) Chcete-li vytisknout druhé mocniny prvních čísel od 1 do n, řekněte 6:

$ awk 'BEGIN { for(i=1;i <=6;i++) print 'square of', i, 'is',i*i; }' 
square of 1 is 1 square of 2 is 4 square of 3 is 9 square of 4 is 16 square of 5 is 25 square of 6 is 36