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
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örawk
. 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
grep
och vilken awk
hänvisar du till? 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.
time
kommandot för att tid hur lång tid det tar att köra kommandot. Ex:time ls -l
.