For å fange et bestemt mønster, awk
og grep
kan brukes. Hvorfor skal vi bruke det ene over det andre? Hva er raskere og hvorfor?
Hvis jeg hadde en loggfil og jeg ønsket å ta tak i et bestemt mønster, kunne jeg gjøre ett av følgende
awk "/pattern/" /var/log/messages
eller
grep "pattern" /var/log/messages
Jeg har ikke gjort noen benchmarking, så jeg vet ikke. Kan noen utdype dette? Det er flott å kjenne de indre funksjonene til disse to verktøyene.
Kommentarer
Svar
grep vil mest sannsynlig være raskere:
# 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 er et tolket programmeringsspråk, der grep er et kompilert c-kodeprogram (som i tillegg er optimalisert for å finne mønstre i filer) .
(Merk – Jeg kjørte begge kommandoene to ganger slik at hurtigbufring ikke potensielt ville skjevt resultatene)
Flere detaljer om tolket språk på wikipedia.
Som Stephane med rette har påpekt i kommentarer, kan kjørelengden din variere på grunn av implementeringen av grep og awk du bruker, operativsystemet det er på og tegnsettet du har behandler.
Kommentarer
- Uten å si hvilken grep- eller awk-implementering du ‘ bruker og på hvilken datamaskinarkitektur, og med hvilket systemtegnsett, disse timingene har liten verdi.
- den andre kommandoen vil også bruke den nylig brukte hurtigbufret versjon. Jeg tviler ikke på at grep er raskere, men ikke så mye som tallene dine viser.
- (derav å kjøre awk, grep, awk, grep og legge ut resultatene fra det andre settet med awk og grep 🙂 og FYI , Jeg bor i et UTF8-område.
- Morsomt nok, med BSD-verktøyene (på en Mac), er awk (31.74s) litt raskere enn sed (33.34s), som er litt raskere enn grep ( 34,21s). Gnu awk eier dem alle på 5.24s, jeg har ikke ‘ t har gnu grep eller sed for å teste.
- grep skal være litt raskere fordi awk gjør mer med hver inngangslinje enn bare å søke etter en regexp i den, f.eks Hvis det er referert til et felt i skriptet (som det ‘ ikke er i dette tilfellet) vil awk dele hver inngangslinje i felt basert på feltutskillerverdien, og den fyller innebygde variabler. men med det du postet, burde det nesten ikke være noen forskjell. Langt den viktigste forskjellen mellom grep og awk wrt matching regexps er at grep søker i hele linjen etter en matchende streng mens awk kan søke i spesifikke felt og dermed gi mer presisjon og færre falske treff.
Svar
Bruk det mest spesifikke og uttrykksfulle verktøyet. Verktøyet som passer best for din brukstilfelle vil sannsynligvis være det raskeste.
Som en grov guide:
- søker du etter linjer som samsvarer med en understreng eller regex? Bruk grep.
- velge bestemte kolonner fra en enkelt avgrenset fil? Bruk cut.
- å utføre mønsterbaserte erstatninger eller … andre ting som sed med rimelighet kan gjøre? Bruk sed.
- trenger du en kombinasjon av de ovennevnte 3, eller printf-formatering eller generelle sløyfer og grener? Bruk awk.
Kommentarer
- +1 unntatt bruk
perl
i stedet forawk
. Hvis du trenger noe mer komplisert enn grep / cut / sed, så er sjansen stor for at ‘ ikke er nok, og du trenger noe » fullt -blåst » - @sds hvorfor ikke python i stedet
- @RetroCode: python er mer » generelt formål » enn perl; den tilsvarende enlinjeren vil sannsynligvis være mye lenger.
- @sds nei, du trenger ikke ‘ t perl med mindre du ‘ skal gjøre noe annet enn tekstbehandling. awk er helt greit for tekstbehandlings ting som ‘ er mer komplisert enn grep / cut / sed og som en bonus kommer som standard på alle UNIX installasjoner, i motsetning til perl.
Svar
Når du bare søker etter strenger, og hastighet betyr noe, bør du nesten alltid bruke grep
. Det er størrelsesorden raskere enn awk
når det gjelder bare grovt søk.
kilde Funksjons- og ytelsesforskjellene til sed, awk og andre Unix-analyseringsverktøy
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
Kommentarer
- Takk for denne fine oversikten over alle disse programmene. Det kaster virkelig lys i mørket.
- ~ headtilt ~ PHP er der, men Perl er ikke ‘ t?
- Hvilken
grep
og hvilkenawk
refererer du til? - Det ‘ er egentlig ikke rettferdig med de andre verktøyene som grep bare søker, og de erstatter også.
- Det er helt falske tall. Snakk om å sammenligne epler og appelsiner – det ‘ er som å si at du bare kan finne en ny bil på nettstedet A på 5 sekunder, mens du kan finne en bil , forhandle om en pris, få et lån og kjøp bilen på sted B på 1 time, så derfor er side A raskere enn side B. Artikkelen du siterte er helt feil i den ‘ uttalelser om relativ kjøringshastighet mellom grep, sed og awk, og det står også
awk ... has PCRE matching for regular expressions
som bare er helt usant.
Svar
Selv om jeg er enig i at grep
skal være raskere enn awk
, i praksis, avhenger YMMV mye av implementeringen du bruker.
her sammenligner vi opptaksboks 1.20.0 «s grep og awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 på Debian / Linux 7.0 amd64 (med glibc 2.17) i et UTF-8-sted på en 240 MB-fil med 2,5 M linjer med kun ASCII-tegn.
$ 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 C lokal, bare GNU grep får et betydelig løft og blir raskere enn mawk
.
Datasettet, typen regexp kan også utgjøre en stor forskjell. For regexps bør awk
sammenlignes med grep -E
da awk
«s regexps er utvidet RE .
For dette datasettet kan awk
være raskere enn grep
på opptattboksbaserte systemer eller systemer der mawk
er standard awk
og standard språk er UTF-8-basert (IIRC, det pleide å være tilfelle i Ubuntu).
Svar
I et nøtteskall gjør grep
bare en ting som mange andre UNIX-verktøy og at «matcher en linje til det gitte mønsteret, og det gjør det bra. På den annen side er awk
et mer sofistikert verktøy ettersom det er et komplett programmeringsspråk definert av POSIX-standard med typiske funksjoner som variabler, matriser, uttrykk, funksjoner eller kontrolluttalelser for mønsterskanning behandling.
Etter min mening avhenger det av implementeringen hvordan begge verktøyene utfører i tilfelle mønstermatching og på størrelsen på noen innspill du vil behandle. Jeg forventer at grep vanligvis er mer effektivt enn vanskelig, da det bare samsvarer. Men du kan ikke skrive med grep en enkel kode for å utføre mer komplekse oppgaver som videre behandling av samsvarende poster, beregning eller utskriftsresultater uten å bruke andre verktøy.
time
kommandoen til tid hvor lang tid det tar å kjøre kommandoen. Eks:time ls -l
.