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
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ístoawk
. 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ů.
time
příkaz, který určuje, jak dlouho trvá spuštění příkazu. Příklad:time ls -l
.