För att fånga ett visst mönster, awk och grep kan användas. Varför ska vi använda varandra? Vilket är snabbare och varför?

Om jag hade en loggfil och jag ville ta ett visst mönster, kunde jag göra något av följande

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

eller

grep "pattern" /var/log/messages 

Jag har inte gjort någon benchmarking, så jag vet inte. Kan någon utarbeta detta? Det är fantastiskt att känna till de inre funktionerna i dessa två verktyg.

Kommentarer

  • Före alla kommandon, till och med skalskript, med time kommandot för att tid hur lång tid det tar att köra kommandot. Ex: time ls -l.

Svar

grep kommer sannolikt vara snabbare:

# 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 är ett tolkat programmeringsspråk, där grep är ett sammanställt c-kodprogram (som dessutom är optimerat för att hitta mönster i filer) .

(Obs! Jag körde båda kommandona två gånger så att cachning inte potentiellt kunde vrida resultaten)

Mer information om tolkade språk på wikipedia.

Som Stephane med rätta har påpekat i kommentarer, kan din körsträcka variera beroende på implementeringen av grep och awk du använder, operativsystemet det är på och karaktärsuppsättningen du bearbetar.

Kommentarer

  • Utan att säga vilken grep- eller awk-implementering du ’ använder och på vilken datorarkitektur och med vilken systemteckenuppsättning, dessa tidsinställningar har lite värde.
  • det andra kommandot kommer också att använda den nyligen cachad version. Jag tvivlar inte på att grep är snabbare men inte lika mycket som dina siffror visar.
  • (därmed kör awk, grep, awk, grep och publicerar resultaten från den andra uppsättningen awk och grep 🙂 och FYI , Jag bor i ett UTF8-land.
  • Roligt nog, med BSD-verktygen (på en Mac) är awk (31.74s) något snabbare än sed (33.34s), vilket är något snabbare än grep ( 34,21s). Gnu awk äger dem alla på 5.24s, jag har inte ’ jag har gnu grep eller sed att testa.
  • grep borde vara lite snabbare eftersom awk gör mer med varje inmatningsrad än att bara söka efter en regexp i den, t.ex. om ett fält refereras till i skriptet (som det ’ inte är i det här fallet) kommer awk att dela upp varje inmatningsrad i fält baserat på fältseparatorvärdet och fylla inbyggda variabler. men med vad du publicerade borde det nästan inte vara någon skillnad. Överlägset den viktigaste skillnaden mellan grep och awk wrt matchande regexps är att grep söker i hela raden efter en matchande sträng medan awk kan söka i specifika fält och så ger mer precision och färre falska matchningar. >

Svar

Använd det mest specifika och uttrycksfulla verktyget. Det verktyg som bäst passar ditt användningsfall är troligtvis det snabbaste.

Som en grov guide:

  • söker du efter rader som matchar en substring eller regexp? Använd grep.
  • markera vissa kolumner från en enkelt avgränsad fil? Använd klippa.
  • utföra mönsterbaserade utbyten eller … andra saker som sed rimligen kan göra? Använd sed.
  • behöver du en kombination av ovanstående 3, eller printf-formatering eller slingor och grenar för allmänt ändamål? Använd awk.

Kommentarer

  • +1 utom använd perl istället för awk. om du behöver något mer komplicerat än grep / klipp / sed, så är chansen att awk vann ’ t räcker och du behöver något ” fullt -blåst ”
  • @sds varför inte python istället
  • @RetroCode: python är mer ” allmänt ändamål ” än perl; motsvarande one-liner kommer förmodligen att vara mycket längre.
  • @sds nej, du behöver inte ’ om du inte ’ kommer att göra något annat än textbehandling. awk är bara bra för textbehandlings saker som ’ är mer komplicerade än grep / cut / sed och som en bonus kommer som standard på alla UNIX-installationer, till skillnad från perl.

Svar

När du bara söker efter strängar och hastighet är viktigt, bör du nästan alltid använda grep. Det är storleksordningar snabbare än awk när det gäller bara grov sökning.

källa Funktions- och prestationsskillnaderna för sed, awk och andra Unix-analyseringsverktyg

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

  • Tack för den här fina översikten över alla dessa program. Det kastar verkligen ljus i mörkret.
  • ~ headtilt ~ PHP finns där men Perl är inte ’ t?
  • Vilken grep och vilken awk hänvisar du till?
  • Det ’ är inte riktigt rättvist mot andra verktyg som grep bara söker och de ersätter också.
  • Det är helt falska siffror. Prata om att jämföra äpplen och apelsiner – det ’ är att säga att du bara kan hitta en ny bil på webbplats A på 5 sekunder medan du kan hitta en bil , förhandla om ett pris, få ett lån och köp bilen på plats B på 1 timme så därför är webbplats A snabbare än webbplats B. Artikeln du citerade är helt fel i den ’ s uttalanden om relativ körhastighet mellan grep, sed och awk och det står också awk ... has PCRE matching for regular expressions vilket bara är helt osant.
  • Svara

    Medan jag håller med om att i teorin ska grep vara snabbare än awk i praktiken beror YMMV mycket på den implementering du använder.

    här jämför jag upptagen 1.20.0 ”s grep och 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 ett UTF-8-språk på en 240 MB-fil med 2,5 miljoner rader med endast ASCII-tecken.

    $ 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 locale, endast GNU grep får en betydande boost och blir snabbare än mawk.

    Datauppsättningen, typen av regexp kan också göra stor skillnad. För regexps ska awk jämföras med grep -E eftersom awk ”s regexps är utökade RE .

    För denna dataset kan awk vara snabbare än grep på upptagenboxbaserade system eller system där mawk är awk och standardinställningen är UTF-8-baserad (IIRC, det brukade vara fallet i Ubuntu).

    Svar

    I ett nötskal gör grep bara en sak som många andra UNIX-verktyg och att ”matchar en linje till det angivna mönstret och det gör det bra. Å andra sidan är awk ett mer sofistikerat verktyg eftersom det är ett komplett programmeringsspråk definierat av POSIX-standard med typiska funktioner som variabler, matriser, uttryck, funktioner eller kontrolluttalanden för mönsterskanning och bearbetning.

    Enligt min mening beror det på implementeringen hur båda verktygen fungerar i händelse av mönstermatchning och på storleken på någon ingång du vill bearbeta. Jag förväntar mig att grep vanligtvis är effektivare än awk eftersom det bara matchar. Men du kan inte skriva med grep en enkel kod för att utföra mer komplexa uppgifter som vidare bearbetning av matchade poster, beräkning eller utskriftsresultat utan att använda andra verktyg.

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *