Úvod
gawk
příkaz je GNU verze awk. Gawk je výkonný nástroj pro zpracování textu a manipulaci s daty s mnoha funkcemi a praktickým využitím.
Tato příručka vás naučí používat Linux gawk
příkaz s příklady.

Předpoklady
- Systém se systémem Linux.
- Přístup k terminálu.
- Textový soubor. Tento výukový program používá soubor people jako příklad.
gawk syntaxe příkazů Linux
Základní gawk
syntaxe vypadá takto:
gawk [options] [actions/filters] input_file
Příkaz nelze spustit bez jakýchkoli argumentů. Možnosti nejsou povinné, ale pro gawk
k vytvoření výstupu by měla být přiřazena alespoň jedna akce. Akce a filtry jsou různé dílčí příkazy a kritéria výběru, které umožňují gawk
pro manipulaci s daty ze vstupního souboru.
Poznámka :Možnosti a akce vložte do jednoduchých uvozovek.
Možnosti gawk
gawk
command je díky četným argumentům všestranným nástrojem. S gawk
je GNU implementací awk
, jsou k dispozici dlouhé možnosti ve stylu GNU. Každá dlouhá možnost má odpovídající krátkou možnost.
Běžné možnosti jsou uvedeny níže:
Možnost | Popis |
---|---|
-f program-file , --file program-file | Čte příkazy ze souboru, který slouží jako skript, namísto prvního argumentu v terminálu. |
-F fs , --field-separator fs | Používá předdefinovanou proměnnou fs jako oddělovač vstupního pole. |
-v var=val , --assign var=val | Přiřadí hodnotu proměnné před spuštěním skriptu. |
-b , --characters-as-bytes | Zachází se všemi daty jako s jednobajtovými znaky. |
-c , --traditional | Spustí gawk v režimu kompatibility. |
-C , --copyright | Zobrazí zprávu o autorských právech GNU. |
-d[file] , --dump-variables[=file] | Zobrazuje seznam proměnných, jejich typy a hodnoty. |
-e program-text , --source program-text | Umožňuje míchání funkcí knihovny a zdrojového kódu. |
-E file , --exec file | Vypne přiřazení terminálových proměnných. |
-L [value] , --lint[=value] | Vytiskne varovné zprávy o kódu, který nelze přenést do jiných implementací AWK. |
-S , --sandbox | Spouští gawk v režimu sandbox. |
vestavěné proměnné gawk
gawk
příkaz nabízí několik vestavěných proměnných používaných k ukládání a přidávání hodnoty příkazu. Proměnné jsou ovládány z terminálu a ovlivňují program pouze tehdy, když jim uživatel přiřadí hodnotu. Některé důležité gawk
vestavěné proměnné jsou:
Proměnná | Popis |
---|---|
ARGC | Zobrazuje počet terminálových argumentů. |
ARGIND | Zobrazuje index souboru ARGV. |
ARGV | Představuje pole terminálových argumentů. |
ERRNO | Obsahuje řetězce popisující systémovou chybu. |
FIELDWIDTHS | Zobrazí seznam šířek polí oddělený mezerami. |
FILENAME | Vytiskne název vstupního souboru. |
FNR | Zobrazuje číslo vstupního záznamu. |
FS | Představuje oddělovač vstupního pole. |
IGNORECASE | Zapne nebo vypne vyhledávání rozlišující velká a malá písmena. |
NF | Vytiskne počet polí vstupního souboru. |
NR | Vytiskne aktuální počet řádků souboru. |
OFS | Zobrazí oddělovač výstupních polí. |
ORS | Zobrazuje oddělovač výstupních záznamů. |
RS | Vytiskne oddělovač vstupních záznamů. |
RSTART | Představuje index prvního shodného znaku. |
RLENGTH | Představuje odpovídající délku řetězce. |
Příklady gawk
Použití gawk
funkce porovnávání vzorů a zpracování jazyka jsou rozsáhlé. Tento článek si klade za cíl poskytnout praktické příklady, jejichž prostřednictvím se uživatelé naučí používat nástroj gawk.
Důležité: gawk
příkaz rozlišuje velká a malá písmena. Použijte IGNORECASE
proměnná ignorovat velká a malá písmena.
Tisk souborů
Ve výchozím nastavení gawk
s print
argument zobrazí každý řádek ze zadaného souboru. Například spuštění příkazu cat na lidech textový soubor vytiskne následující:

gawk
příkaz zobrazí stejný výsledek:
gawk '{print}' people

Vytisknout sloupec
V textových souborech se jako oddělovače sloupců obvykle používají mezery. lidé soubor se skládá ze čtyř sloupců:
- Pořadová čísla.
- Křestní jména.
- Příjmení.
- Rok narození.
Použijte gawk
zobrazit pouze určitý sloupec v terminálu. Například:
gawk '{print $2}' people

Příkaz vytiskne pouze druhý sloupec. Chcete-li vytisknout více sloupců, například sloupec jedna (řadová čísla) a sloupec dva (křestní jména), spusťte:
gawk '{print $1, $2}' people

gawk
příkaz také funguje bez čárky mezi $1
a $2
. Ve výstupu však nejsou žádné mezery mezi sloupci:
gawk '{print $1 $2}' people

Filtrovat sloupce
gawk
příkaz nabízí další možnosti filtrování. Například vytiskněte řádky obsahující velké písmeno O s:
gawk '/O/ {print}' people

Chcete-li zobrazit pouze řádky obsahující písmena O nebo A , použijte potrubí:
gawk '/O|A/ {print}' people

Příkaz vytiskne libovolný řádek, který obsahuje slovo s velkým O nebo A . Na druhou stranu použijte logické AND (&&
), aby se zobrazily řádky včetně O a rok 1995 :
gawk '/O/ && /1995/' people

Filtry pracují i s čísly. Například zobrazit pouze osoby narozené v 90. letech s:
gawk '/199*/ {print}' people

Výstup zobrazuje pouze řádky, ve kterých čtvrtý sloupec obsahuje hodnotu 199 .
Přizpůsobte si výstup ještě více kombinací výše uvedených možností. Například tiskněte pouze jména a příjmení osob narozených v 1995 nebo 2003 s:
gawk '/1995|2003/ {print $2, $3}' people

Příkaz vytiskne sloupce dva a tři, jak je uvedeno v {print $2, $3}
část. Výstup zobrazuje pouze řádky obsahující čísla 1995 a 2003 , i když jsou sloupce obsahující tato čísla skryté.
gawk
příkaz také umožňuje uživatelům tisknout vše kromě řádků obsahujících zadaný řetězec s logickým NOT (!
). Vynechejte například řádky obsahující řetězec 19 ve výstupu:
gawk '!/19/' people

Přidat čísla řádků
lidé soubor obsahuje čísla řádků v prvním sloupci. V případě, že uživatelé pracují na souboru bez čísel řádků, gawk
nabízí možnosti jejich přidání.
Například lidé soubor neobsahuje žádná pořadová čísla:

Chcete-li přidat čísla řádků, spusťte gawk
s FNR
a next
:
gawk '{ print FNR, $0; next}' humans

Příkaz přidá před každý řádek číslo řádku. Stejného výsledku je dosaženo s NR
proměnná:
gawk '{print NR, $0}' mobile.txt

Najít počet řádků
Chcete-li spočítat celkový počet řádků v souboru, použijte END
a NR
proměnná s gawk
:
gawk 'END { print NR }' people

Příkaz přečte každý řádek. Jednou gawk
dosáhne END
, vypíše hodnotu NR
- který obsahuje celkový počet řádků. Spuštění stejného příkazu bez END
výpis vypíše pouze hodnotu NR
- počet řádků:

Filtrovat čáry podle délky
Chcete-li tisknout pouze řádky delší než 20 znaků, použijte následující volbu příkazu:
gawk 'length>20' people

Pracuje také s více argumenty. Zobrazte například řádky delší než 17 ale kratší než 20 znaky:
gawk 'length<20 && length>17' people

Chcete-li zobrazit řádky, které mají přesně 20 znaků, spusťte:
gawk 'length==20' people

Tisk informací na základě podmínek
gawk
příkaz umožňuje použití příkazů if-else. Například další způsob, jak filtrovat pouze osoby narozené po 1999 je s jednoduchým příkazem if:
gawk '{ if ($4>1999) print }' people

Příkaz if nastavuje podmínku, že položky ve čtvrtém sloupci musí být větší než 1999 . Výstup zobrazuje pouze položky, které splňují podmínku. Rozbalte příkaz do příkazu if-else a vytiskněte řádky, které nesplňují původní podmínku.
gawk '{if ($4>1999) print $0," ==>00s"; else print $0, "==>90s"}' people

Příkaz obsahuje:
- Příkaz If. Pokud je podmínka splněna,
gawk
přidá řetězec „==>90s " na výstupní řádek. - Jiné prohlášení. V případě, že řádek nesplňuje podmínku,
gawk
stále vytiskne tento řádek ve výstupu a přidá „==>00s "" na výstup.
Přidat záhlaví
Stejným způsobem jako END
umožňuje uživatelům upravit výstup na konci souboru, BEGIN
příkaz formátuje data na začátku.
Při použití s awk
, BEGIN
sekce se vždy provádějí jako první. Poté awk
provede zbývající řádky. Jeden způsob použití BEGIN
je přidat záhlaví k výstupu.
Provedením následujícího příkazu přidejte sekci nad awk
výstup:
gawk 'BEGIN {print "No/First&Last Name/Year of Birth"} {print $0}' people

Najděte nejdelší délku čáry
Zkombinujte předchozí argumenty s if a END
příkazy najít nejdelší řádek v lidech soubor:
gawk '{ if (length($0) > max) max = length($0) } END { print max }' people

Zjistěte počet polí
gawk
také umožňuje uživatelům zobrazit počet polí s NF
variabilní. Nejjednodušší způsob, jak zobrazit počet polí, vytiskne obtížně čitelný výstup:
gawk '{print NF}' people

Příkaz vypíše počet polí na řádek bez dalších informací. Chcete-li přizpůsobit výstup a učinit jej čitelnějším pro člověka, upravte počáteční příkaz:
gawk '{print NR, "-->", NF}' people

Příkaz nyní obsahuje:
NR
proměnná, která ke každému výstupnímu řádku přidává čísla řádků.-->
řetězec, který odděluje čísla řádků od čísel polí.
Další způsob, jak zobrazit čísla řádků a polí v lidech soubor má tisknout sloupce s NF
. Všimněte si, že lidé soubor obsahuje v prvním sloupci pořadová čísla. Proto NR
proměnná je vynechána:
gawk '{print $0, "-->", NF}' people

Nakonec, chcete-li vytisknout celkový počet polí, proveďte:
gawk '{num_fields = num_fields + NF} END {print num_fields}' people

Soubor má deset řádků a čtyři sloupce. Výstup je tedy správný.
Závěr
Poté, co si projdete tento tutoriál, víte, jak používat gawk
pro pokročilé zpracování textu a manipulaci s daty.
Zvažte také použití grep, mocného linuxového nástroje pro vyhledávání řetězců, slov a vzorů.