- Skenujte soubory, řádek po řádku.
- Rozdělte každý řádek na pole / sloupce.
- Určete vzory a porovnejte řádky souboru s těmito vzory
- Proveďte různé akce na řádcích, které odpovídají danému vzoru
V tomto článku vysvětlíme základní použití příkazu awk a jeho použití k rozdělení souboru řetězců. Ukázky z tohoto článku jsme provedli na systému Debian 10 Buster, ale lze je snadno replikovat na většině linuxových distribucí.
Ukázkový soubor, který použijeme
Ukázkový soubor řetězců, které budeme používat k demonstraci použití příkazu awk, je následující:
To naznačuje každý sloupec ukázkového souboru:
- První sloupec obsahuje jména zaměstnanců / učitelů ve škole
- Druhý sloupec obsahuje předmět, který zaměstnanec učí
- Třetí sloupec označuje, zda je zaměstnanec profesorem nebo odborným asistentem
- Čtvrtý sloupec obsahuje mzdu zaměstnance
Příklad 1: Pomocí Awk vytisknete všechny řádky souboru
Tisk každého řádku zadaného souboru je výchozím chováním příkazu awk. V následující syntaxi příkazu awk neurčujeme žádný vzor, který by awk měl tisknout, proto má příkaz použít akci „tisk“ na všechny řádky souboru.
Syntax:
$ awk 'print' název souboru.txtPříklad:
V tomto příkladu říkám příkazu awk, aby tiskl obsah mého ukázkového souboru řádek po řádku.
$ awk 'print' sample_file.txt
Příklad 2: Pomocí awk vytisknete pouze řádky, které odpovídají danému vzoru
Pomocí awk můžete určit vzor a příkaz vytiskne pouze řádky odpovídající tomuto vzoru.
Syntax:
$ awk '/ pattern_to_be_matched / print' název souboru.txtPříklad:
Ze vzorového souboru, pokud chci vytisknout pouze řádky, které obsahují proměnnou 'B', mohu použít následující příkaz:
$ awk '/ B / print' sample_file.txt
Aby byl příklad smysluplnější, dovolte mi vytisknout pouze informace o zaměstnancích, kteří jsou „profesorem“.
$ awk '/ professor / print' sample_file.txt
Příkaz vytiskne pouze řádky / položky, které obsahují řetězec „professor“, takže z dat máme cennější informace.
Příklad 3. Použijte awk k rozdělení souboru tak, aby se tiskla pouze konkrétní pole / sloupce
Místo tisku celého souboru můžete udělat awk, aby tiskl pouze konkrétní sloupce souboru. Awk ve výchozím nastavení považuje všechna slova oddělená mezerou v řádku za záznam sloupce. Ukládá záznam do proměnné $ N. Kde $ 1 představuje první slovo, $ 2 ukládá druhé slovo, $ 3 čtvrté atd. $ 0 ukládá celý řádek, takže se vytiskne řádek who, jak je vysvětleno v příkladu 1.
Syntax:
$ awk 'tisknout $ N,… .' název souboru.txtPříklad:
Následující příkaz vytiskne pouze první sloupec (název) a druhý sloupec (předmět) mého ukázkového souboru:
$ awk 'print $ 1, $ 2' sample_file.txt
Příklad 4: Pomocí Awk spočítejte a vytiskněte počet řádků, ve kterých je vzor shodný
Můžete říct awk, aby spočítal počet řádků, ve kterých se shoduje zadaný vzor, a poté vygenerovat tento 'počet'.
Syntax:
$ awk '/ pattern_to_be_matched / ++ cnt END print "Count =", cnt'název souboru.txt
Příklad:
V tomto příkladu chci spočítat počet osob vyučujících předmět „anglicky“. Proto povím příkazu awk, aby odpovídal vzoru „anglicky“ a vytiskl počet řádků, ve kterých je tento vzor shodný.
$ awk '/ english / ++ cnt END print "Count =", cnt' sample_file.txt
Počet zde naznačuje, že 2 lidé učí angličtinu ze záznamů ukázkových souborů.
Příklad 5: Pomocí awk vytisknete pouze řádky s více než určitým počtem znaků
U tohoto úkolu použijeme vestavěnou funkci awk nazvanou „délka“. Tato funkce vrací délku vstupního řetězce. Pokud tedy chceme, aby awk tiskl pouze řádky s větším nebo dokonce menším počtem znaků, můžeme použít délkovou funkci následujícím způsobem:
Pro tisk řádků se znaky většími než číslo:
$ awk 'length ($ 0)> n' název souboru.txtPro tisk řádků se znaky menšími než číslo:
$ awk 'length ($ 0) < n' filename.txtKde n je počet znaků, který chcete pro řádek zadat.
Příklad:
Následující příkaz vytiskne pouze řádky z mého ukázkového souboru, které mají znaky více než 30:
$ awk 'length ($ 0)> 30' sample_file.txt
Příklad 6: Použijte awk k uložení výstupu příkazu do jiného souboru
Pomocí operátoru přesměrování '>' můžete pomocí příkazu awk vytisknout jeho výstup do jiného souboru. Takto jej můžete použít:
$ awk'kritéria_to_tisk "název souboru.txt> výstupní soubor.txtPříklad:
V tomto příkladu použiji operátor přesměrování s mým příkazem awk k vytištění pouze jmen zaměstnanců (sloupec 1) do nového souboru:
$ awk 'print $ 1' sample_file.txt> jména zaměstnanců.txt
Prostřednictvím příkazů kočky jsem ověřil, že nový soubor obsahuje pouze jména zaměstnanců.
Příklad 7: Použijte awk k tisku pouze neprázdných řádků ze souboru
Awk má několik předdefinovaných příkazů, které můžete použít k filtrování výstupu. Například příkaz NF se používá k udržení počtu polí v aktuálním vstupním záznamu. Zde použijeme příkaz NF k tisku pouze neprázdných řádků souboru:
$ awk 'NF> 0' sample_file.txtJe zřejmé, že k tisku prázdných řádků můžete použít následující příkaz:
$ awk 'NF < 0' sample_file.txtPříklad 8: Pomocí awk spočítejte celkový počet řádků v souboru
Další vestavěná funkce zvaná NR udržuje počet vstupních záznamů (obvykle řádků) daného souboru. Tuto funkci můžete použít v awk následujícím způsobem k spočítání počtu řádků v souboru:
$ awk 'END print NR' sample_file.txt
To byly základní informace, které potřebujete k rozdělení souborů pomocí příkazu awk. Kombinaci těchto příkladů můžete použít k načtení smysluplnějších informací ze souboru řetězců pomocí awk.