Om een bepaald patroon vast te leggen, awk
en grep
kan worden gebruikt. Waarom zouden we de ene boven de andere gebruiken? Wat is sneller en waarom?
Als ik een logbestand had en ik wilde een bepaald patroon pakken, zou ik een van de volgende dingen kunnen doen
awk "/pattern/" /var/log/messages
of
grep "pattern" /var/log/messages
Ik heb geen benchmarking gedaan, dus ik zou het niet weten. Kan iemand dit toelichten? Het is geweldig om de interne werking van deze twee tools te kennen.
Opmerkingen
Antwoord
grep zal hoogstwaarschijnlijk wees sneller:
# 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 is een geïnterpreteerde programmeertaal, waar grep een gecompileerd c-code programma is (dat bovendien geoptimaliseerd is voor het vinden van patronen in bestanden) .
(Opmerking – ik heb beide opdrachten twee keer uitgevoerd, zodat caching de resultaten niet mogelijk scheeftrekt)
Meer details over geïnterpreteerde talen op wikipedia.
Zoals Stephane terecht in opmerkingen heeft opgemerkt, kan uw kilometerstand variëren als gevolg van de implementatie van de grep en awk die u gebruikt, het besturingssysteem waarop het staat en de tekenset die u gebruikt worden verwerkt.
Reacties
- Zonder te zeggen welke grep of awk implementatie je ‘ hergebruikt en op welke computerarchitectuur en met welke systeemtekenset, die timings hebben weinig waarde.
- het tweede commando zal ook de nieuwe cacheversie. Ik twijfel er niet aan dat grep sneller is, maar niet zoveel als je getallen laten zien.
- (vandaar het uitvoeren van awk, grep, awk, grep en het posten van de resultaten van de tweede set van awk en grep 🙂 en FYI , Ik woon in een UTF8-locale.
- Grappig genoeg is awk (31.74s) met de BSD-tools (op een Mac) iets sneller dan sed (33.34s), wat iets sneller is dan grep ( 34.21s). Gnu awk bezit ze allemaal op 5.24s, ik ‘ heb geen gnu grep of sed om te testen.
- grep zou iets sneller moeten zijn omdat awk meer doet met elk invoerregel dan gewoon zoeken naar een regexp erin, bijv als er in het script naar een veld wordt verwezen (waarnaar het ‘ s niet in dit geval) zal awk elke invoerregel opsplitsen in velden op basis van de veldscheidingstekenwaarde en het vult ingebouwde variabelen in. maar met wat je hebt gepost, zou er bijna geen verschil moeten zijn. Verreweg het belangrijkste verschil tussen grep en awk wrt-overeenkomende regexps is dat grep de hele regel doorzoekt naar een overeenkomende string, terwijl awk specifieke velden kan doorzoeken en dus meer precisie en minder valse overeenkomsten biedt.
Antwoord
Gebruik de meest specifieke en expressieve tool. De tool die het beste bij uw gebruikssituatie past, is waarschijnlijk de snelste.
Als een grove richtlijn:
- zoeken naar regels die overeenkomen met een substring of regexp? Gebruik grep.
- het selecteren van bepaalde kolommen uit een eenvoudig gescheiden bestand? Gebruik cut.
- het uitvoeren van op patronen gebaseerde substituties of … andere dingen die sed redelijkerwijs kan doen? Gebruik sed.
- heb je een combinatie van de bovenstaande 3 nodig, of printf-opmaak, of algemene loops en branches? Gebruik awk.
Reacties
- +1 behalve gebruik
perl
in plaats vanawk
. als je iets ingewikkelder nodig hebt dan grep / cut / sed, dan is de kans groot dat awk won ‘ niet genoeg is en heb je iets nodig ” vol -blown ” - @sds waarom niet in plaats daarvan python
- @RetroCode: python is meer ” algemeen gebruik ” dan perl; de equivalente one-liner zal waarschijnlijk veel langer zijn.
- @sds nee, je hebt ‘ geen perl nodig, tenzij je ‘ gaat iets anders doen dan tekstverwerking. awk is prima voor de tekstverwerkingsdingen die ‘ gecompliceerder zijn dan grep / cut / sed en als bonus standaard op alle UNIX-installaties zit, in tegenstelling tot perl.
Antwoord
Als je alleen zoekt naar strings, en snelheid belangrijk is, zou je bijna altijd grep
. Het is ordes van grootte sneller dan awk
als het gaat om grof zoeken.
source De functionele en prestatieverschillen van sed, awk en andere Unix-ontleedhulpprogrammas
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
Reacties
- Bedankt voor dit mooie overzicht van al deze programmas. Het werpt echt licht in de duisternis.
- ~ headtilt ~ PHP staat daar maar Perl is niet ‘ t?
- Naar welke
grep
en naar welkeawk
verwijst u? - Het ‘ is niet echt eerlijk tegenover de andere utils die grep alleen zoekt en ze vervangen ook.
- Dat zijn volkomen nepnummers. Praten over het vergelijken van appels en peren – het ‘ is alsof je zegt dat je alleen een nieuwe auto kunt vinden op website A in 5 seconden, terwijl je een auto kunt vinden , onderhandel over een prijs, ontvang een lening en koop de auto op site B in 1 uur, dus daarom is site A sneller dan site B. Het artikel dat u citeerde, is er helemaal verkeerd in ‘ s verklaringen van relatieve uitvoeringssnelheid tussen grep, sed en awk en er staat ook
awk ... has PCRE matching for regular expressions
wat gewoon helemaal niet waar is.
Antwoord
Hoewel ik het ermee eens ben dat grep
in theorie sneller zou moeten zijn dan awk
, in de praktijk hangt YMMV, aangezien dat sterk af van de implementatie die u gebruikt.
hier worden busybox 1.20.0 “s grep en awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 op Debian / Linux 7.0 amd64 (met glibc 2.17) in een UTF-8 locale op een 240 MB bestand van 2,5 miljoen regels met alleen ASCII-tekens.
$ 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
In de C locale, alleen GNU grep krijgt een significante boost en wordt sneller dan mawk
.
De dataset, het type regexp kan ook een groot verschil maken. Voor regexps moet awk
worden vergeleken met grep -E
aangezien awk
“s regexps uitgebreide REs zijn .
Voor deze dataset zou awk
sneller kunnen zijn dan grep
op busybox-gebaseerde systemen of systemen waar mawk
is de standaard awk
en de standaardlandinstelling is gebaseerd op UTF-8 (IIRC, dit was vroeger het geval in Ubuntu).
Antwoord
In een notendop, grep
doet slechts één ding zoals veel andere UNIX-tools en dat “past een lijn aan het gegeven patroon aan en het doet het goed. Aan de andere kant is awk
een geavanceerdere tool, aangezien het een complete programmeertaal is die wordt gedefinieerd door POSIX-standaard met typische kenmerken zoals variabelen, arrays, uitdrukkingen, functies of besturingsinstructies voor het scannen van patronen en verwerken.
Naar mijn mening hangt het af van de implementatie hoe beide tools presteren in het geval van patroonovereenkomst en van de grootte van de input die je wilt verwerken. Ik zou verwachten dat grep meestal efficiënter is dan awk, omdat het alleen matching doet. Maar u kunt niet met grep een eenvoudige code schrijven om complexere taken uit te voeren, zoals verdere verwerking van overeenkomende records, berekeningen of afdrukresultaten zonder andere tools te gebruiken.
time
commando om te bepalen hoe lang het duurt om het commando uit te voeren. Bijv .:time ls -l
.