Chcete-li zachytit konkrétní vzor, awk a grep lze použít. Proč bychom měli používat jeden nad druhým? Který je rychlejší a proč?

Pokud bych měl soubor protokolu a chtěl bych uchopit určitý vzor, mohl bych udělat jeden z následujících

awk "/pattern/" /var/log/messages 

nebo

grep "pattern" /var/log/messages 

Neprovedl jsem žádný test, takže bych o tom nevěděl. Může to někdo rozvinout? Je skvělé znát vnitřní fungování těchto dvou nástrojů.

Komentáře

  • Předcházejte jakýmkoli příkazům, dokonce i skriptům prostředí, pomocí time příkaz, který určuje, jak dlouho trvá spuštění příkazu. Příklad: time ls -l.

Odpověď

grep bude s největší pravděpodobností buďte rychlejší:

# time awk "/USAGE/" imapd.log.1 | wc -l 73832 real 0m2.756s user 0m2.740s sys 0m0.020s # time grep "USAGE" imapd.log.1 | wc -l 73832 real 0m0.110s user 0m0.100s sys 0m0.030s 

awk je interpretovaný programovací jazyk, kde jako grep je kompilovaný program c-kódu (který je navíc optimalizován pro hledání vzorů v souborech) .

(Poznámka – oba příkazy jsem spustil dvakrát, aby ukládání výsledků do mezipaměti potenciálně nezměnilo výsledky.)

Další podrobnosti o interpretovaných jazycích na wikipedii.

Jak Stephane správně zdůraznil v komentářích, váš počet najetých kilometrů se může lišit v důsledku implementace grep a awk, které používáte, operačního systému, ve kterém je, a znakové sady, kterou používáte zpracovávají.

Komentáře

  • Aniž byste říkali, jakou implementaci grep nebo awk ‚ znovu používáte a dále jakou architekturu počítače a se kterou znakovou sadou systému mají tato časování malou hodnotu.
  • druhý příkaz bude používat také nově verze v mezipaměti. Nepochybuji o tom, že grep je rychlejší, ale ne o tolik, kolik ukazují vaše čísla.
  • (proto běží awk, grep, awk, grep a zveřejnění výsledků z druhé sady awk a grep 🙂 a FYI , Žiji v národním prostředí UTF8.
  • Dost vtipné, že s nástroji BSD (na Macu) je awk (31,74 s) o něco rychlejší než sed (33,34 s), což je o něco rychlejší než grep ( 34,21 s). Gnu awk je vlastní za 5,24 s, nemám ‚ k testování gnu grep nebo sed.
  • grep by měl být o něco rychlejší, protože awk dělá s každým více vstupní řádek, než jen hledat regexp v něm, např pokud je ve skriptu odkazováno na pole (které v tomto případě ‚ není) awk rozdělí každý vstupní řádek na pole na základě hodnoty oddělovače pole a vyplní vestavěné proměnné. ale s tím, co jste zveřejnili, by neměl být téměř žádný rozdíl. Zdaleka nejdůležitější nejdůležitější rozdíl mezi regulárními výrazy grep a awk wrt spočívá v tom, že grep prohledá celý řádek po odpovídajícím řetězci, zatímco awk může prohledávat konkrétní pole, a tak poskytovat větší přesnost a méně falešných shod.

Odpověď

Použijte nejkonkrétnější a nejexpresnější nástroj. Nástroj, který nejlépe vyhovuje vašemu případu použití, bude pravděpodobně nejrychlejší.

Jako hrubý průvodce:

  • Hledáte řádky odpovídající podřetězci nebo regulárnímu výrazu? Chcete použít grep.
  • vybrat určité sloupce ze souboru s jednoduchým oddělením? Použijte střih.
  • provádění substitucí založených na vzorech nebo … jiné věci, které sed může rozumně dělat? Použijte sed.
  • Potřebujete nějakou kombinaci výše uvedených 3 nebo printf formátování nebo univerzální smyčky a větve? Použijte awk.

Komentáře

  • +1 kromě použití perl namísto awk. pokud potřebujete něco komplikovanějšího než grep / cut / sed, je pravděpodobné, že nebude stačit ‚ stačit a budete potřebovat něco “ plné -blown “
  • @sds proč ne python místo toho
  • @RetroCode: python je více “ obecný účel “ než perl; ekvivalentní jednorázová linka bude pravděpodobně mnohem delší.
  • @sds ne, nepotřebujete ‚ perl, pokud ‚ dělá něco jiného než zpracování textu. awk je v pořádku pro věci na zpracování textu, které jsou ‚ komplikovanější než grep / cut / sed a jako bonus jsou standardem u všech instalací UNIX, na rozdíl od Perlu.

Odpověď

Při vyhledávání řetězců a rychlosti záleží téměř vždy na grep. Pokud jde o pouhé hrubé vyhledávání, je to řádově rychlejší než awk

source Funkční a výkonové rozdíly sed, awk a dalších utilit pro analýzu Unixu

UTILITY OPERATION TYPE EXECUTION TIME CHARACTERS PROCESSED PER SECOND (10 ITERATIONS) ------- -------------- --------------- ------------------------------- grep search only 41 sec. 489.3 million sed search & replace 4 min. 4 sec. 82.1 million awk search & replace 4 min. 46 sec. 69.8 million Python search & replace 4 min. 50 sec. 69.0 million PHP search & replace 15 min. 44 sec. 21.2 million 

Komentáře

  • Děkujeme za tento pěkný přehled všech těchto programů. Opravdu vrhá světlo do tmy.
  • ~ headtilt ~ PHP je tam, ale Perl není ‚ t?
  • Na které grep a na které awk odkazujete?
  • It ‚ není opravdu fér vůči ostatním nástrojům, které grep právě hledá a také nahrazují.
  • To jsou zcela falešná čísla. Mluvte o srovnání jablek a pomerančů – ‚ je to jako říkat, že nové auto můžete najít pouze na webu A za 5 sekund, zatímco auto najdete , vyjednat cenu, získat půjčku a koupit auto na stránce B za 1 hodinu, takže stránka A je rychlejší než stránka B. Článek, který jste citovali, je v něm zcela chybný ‚ s prohlášení o relativní rychlosti provádění mezi grep, sed a awk a také říká awk ... has PCRE matching for regular expressions což je prostě naprosto nepravdivé.

Odpověď

I když souhlasím s tím, že teoreticky by měl být grep rychlejší než awk v praxi YMMV velmi záleží na implementaci, kterou používáte.

zde porovnáváme grep a awk busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 na Debian / Linux 7.0 amd64 (s glibc 2.17) v národním prostředí UTF-8 na 240 MB souboru 2,5M řádků znaků pouze ASCII.

$ time busybox grep error error | wc -l 331003 busybox grep error error 8.31s user 0.12s system 99% cpu 8.450 total wc -l 0.07s user 0.11s system 2% cpu 8.448 total $ time busybox awk /error/ error | wc -l 331003 busybox awk /error/ error 2.39s user 0.84s system 98% cpu 3.265 total wc -l 0.12s user 1.23s system 41% cpu 3.264 total $ time grep error error | wc -l 331003 grep error error 0.80s user 0.10s system 99% cpu 0.914 total wc -l 0.00s user 0.11s system 12% cpu 0.913 total $ time mawk /error/ error | wc -l 330803 mawk /error/ error 0.54s user 0.13s system 91% cpu 0.732 total wc -l 0.03s user 0.08s system 14% cpu 0.731 total $ time gawk /error/ error | wc -l 331003 gawk /error/ error 1.37s user 0.12s system 99% cpu 1.494 total wc -l 0.04s user 0.07s system 7% cpu 1.492 total $ time 

V C. národní prostředí, pouze GNU grep získá významnou podporu a bude rychlejší než mawk.

Datová sada, typ regexp může také mít velký rozdíl. U regexps by měly být awk srovnávány s grep -E, protože awk jsou regexps rozšířené RE .

U této datové sady může být awk rychlejší než grep v systémech založených na busyboxech nebo systémech, kde mawk je výchozí awk a výchozí národní prostředí je založeno na UTF-8 (IIRC, v Ubuntu tomu tak bylo dříve).

Odpověď

Stručně řečeno, grep dělá jednu věc jen jako mnoho jiných nástrojů UNIX a to „odpovídá řádku k danému vzoru a dělá to dobře. Na druhou stranu je awk sofistikovanější nástroj, protože se jedná o kompletní programovací jazyk definovaný standardem POSIX s typickými vlastnostmi, jako jsou proměnné, pole, výrazy, funkce nebo řídicí příkazy pro skenování vzorů a zpracovává se.

Podle mého názoru záleží na implementaci, jak oba nástroje fungují v případě shody vzorů, a na velikosti nějakého vstupu, který chcete zpracovat. Očekával bych, že grep je obvykle efektivnější než awk, protože se shoduje pouze. Ale nemůžete psát s grepem jednoduchý kód k provádění složitějších úkolů, jako je další zpracování spárovaných záznamů, výpočet nebo tisk výsledků bez použití dalších nástrojů.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *