For at fange et bestemt mønster skal awk og grep kan bruges. Hvorfor skal vi bruge det ene over det andet? Hvilket er hurtigere, og hvorfor?

Hvis jeg havde en logfil, og jeg ønskede at få fat i et bestemt mønster, kunne jeg gøre et af følgende

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

eller

grep "pattern" /var/log/messages 

Jeg har ikke foretaget nogen benchmarking, så jeg ville ikke vide det. Kan nogen uddybe dette? Det er dejligt at kende disse to værktøjers indre funktion.

Kommentarer

  • Forud for enhver kommando, endda shell-scripts, med time kommandoen til tid, hvor lang tid det tager at køre kommandoen. Eks: time ls -l.

Svar

grep vil sandsynligvis være være hurtigere:

# 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 fortolket programmeringssprog, hvor grep er et kompileret c-kodeprogram (der desuden er optimeret til at finde mønstre i filer) .

(Bemærk – jeg kørte begge kommandoer to gange, så cache ikke potentielt kunne skæve resultaterne)

Flere detaljer om fortolkede sprog på wikipedia.

Som Stephane med rette har påpeget i kommentarer, kan din kilometertal variere på grund af implementeringen af grep og awk, du bruger, det operativsystem det er på og tegnsættet du behandler.

Kommentarer

  • Uden at sige hvilken grep- eller awk-implementering du ‘ bruger og til hvilken computerarkitektur, og med hvilket systemtegnsæt, disse timings har ringe værdi.
  • den anden kommando bruger også den nyligt cachelagret version. Jeg tvivler ikke på, at grep er hurtigere, men ikke så meget som dine tal viser.
  • (dermed kører awk, grep, awk, grep og sender resultaterne fra det andet sæt awk og grep 🙂 og FYI , Jeg bor i et UTF8-sprog.
  • Sjovt nok, med BSD-værktøjerne (på en Mac) er awk (31.74s) lidt hurtigere end sed (33.34s), hvilket er lidt hurtigere end grep ( 34,21s). Gnu awk ejer dem alle på 5.24s, jeg har ikke ‘ t har gnu grep eller sed til at teste.
  • grep skal være lidt hurtigere, fordi awk gør mere med hver inputlinje end bare at søge efter en regexp i den, f.eks Hvis der henvises til et felt i scriptet (som det ‘ ikke er i dette tilfælde) vil awk opdele hver inputlinje i felter baseret på feltadskillelsesværdien, og den udfylder indbyggede variabler. men med hvad du skrev, skulle der næsten ikke være nogen forskel. Langt den vigtigste forskel mellem grep og awk wrt matchende regexps er, at grep søger i hele linjen efter en matchende streng, mens awk kan søge i specifikke felter og dermed give mere præcision og færre falske matches.

Svar

Brug det mest specifikke og udtryksfulde værktøj. Det værktøj, der bedst passer til din brugssag, er sandsynligvis det hurtigste.

Som en grov guide:

  • søger du efter linjer, der matcher en understreng eller regex? Brug grep.
  • vælg bestemte kolonner fra en simpelt afgrænset fil? Brug cut.
  • udfører mønsterbaserede erstatninger eller … andre ting, sed med rimelighed kan gøre? Brug sed.
  • har du brug for en kombination af ovenstående 3 eller printf-formatering eller generelle sløjfer og grene? Brug awk.

Kommentarer

  • +1 undtagen brug perl i stedet for awk. hvis du har brug for noget mere kompliceret end grep / cut / sed, så er chancerne awk won ‘ t være nok, og du har brug for noget ” fuld -blæst ”
  • @sds hvorfor ikke python i stedet
  • @RetroCode: python er mere ” generelt formål ” end perl; den tilsvarende one-liner vil sandsynligvis være meget længere.
  • @sds nej, du behøver ikke ‘ perl, medmindre du ‘ vil gøre noget andet end tekstbehandling. awk er bare fint for tekstbehandlings ting, som ‘ er mere kompliceret end grep / cut / sed og som en bonus kommer som standard på alle UNIX-installationer, i modsætning til perl.

Svar

Når du kun søger efter strenge, og hastighed betyder noget, skal du næsten altid bruge grep. Det er størrelsesordener hurtigere end awk når det kommer til bare grov søgning.

kilde De funktionelle og præstationsforskelle i sed, awk og andre Unix-parseringsværktøjer

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

  • Tak for denne gode oversigt over alle disse programmer. Det kaster virkelig lys i mørket.
  • ~ headtilt ~ PHP er der, men Perl er ikke ‘ t?
  • Hvilken grep og hvilken awk henviser du til?
  • Det ‘ er ikke rigtig fair over for de andre værktøjer, som grep bare søger, og de erstatter også.
  • Det er helt falske tal. Tal om at sammenligne æbler og appelsiner – det ‘ er som at sige, at du kun kun kan finde en ny bil på websted A om 5 sekunder, mens du kan finde en bil , forhandle en pris, få et lån og køb bilen på sted B på 1 time, så derfor er side A hurtigere end side B. Den artikel, du citerede, er helt forkert i den ‘ s udsagn om relativ eksekveringshastighed mellem grep, sed og awk, og der står også awk ... has PCRE matching for regular expressions hvilket bare er helt usant.

Svar

Mens jeg er enig i at grep i teorien skal være hurtigere end awk , i praksis, afhænger YMMV meget af den implementering, du bruger.

her sammenlignes optaget 1.20.0 “s grep og awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 on Debian / Linux 7.0 amd64 (med glibc 2.17) i et UTF-8-sprog 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 

I C landestandard, kun GNU grep får en betydelig boost og bliver hurtigere end mawk.

Datasættet, typen af regexp kan også gøre en stor forskel. For regexps skal awk sammenlignes med grep -E da awk “s regexps er udvidede REer .

For dette datasæt kan awk være hurtigere end grep på optagekassebaserede systemer eller systemer, hvor mawk er standard awk og standard landestandarden er UTF-8 baseret (IIRC, det plejede at være tilfældet i Ubuntu).

Svar

I en nøddeskal gør grep kun én ting som mange andre UNIX-værktøjer, og at “matcher en linje til det givne mønster, og det klarer det godt. På den anden side er awk et mere sofistikeret værktøj, da det er et komplet programmeringssprog defineret af POSIX-standard med typiske funktioner som variabler, arrays, udtryk, funktioner eller kontroludtalelser til mønsterscanning og forarbejdning.

Efter min mening afhænger det af implementeringen, hvordan begge værktøjer udfører i tilfælde af mønstermatchning og af størrelsen på noget input, du vil behandle. Jeg forventer, at grep normalt er mere effektiv end awk, da det kun matcher. Men du kan ikke skrive med grep en simpel kode for at udføre mere komplekse opgaver som yderligere behandling af matchede poster, beregning eller udskrivningsresultater uden brug af andre værktøjer.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *