Per acquisire uno schema particolare, awk
e grep
può essere utilizzato. Perché dovremmo usarne uno sullaltro? Qual è più veloce e perché?
Se avessi un file di log e volessi prendere un certo pattern, potrei fare una delle seguenti
awk "/pattern/" /var/log/messages
o
grep "pattern" /var/log/messages
Non ho fatto alcun benchmarking, quindi non lo saprei. Qualcuno può elaborare questo? È fantastico conoscere il funzionamento interno di questi due strumenti.
Commenti
Risposta
grep molto probabilmente essere più veloce:
# 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 è un linguaggio di programmazione interpretato, dove grep è un programma c-code compilato (che è inoltre ottimizzato per trovare modelli nei file) .
(Nota: ho eseguito entrambi i comandi due volte in modo che la memorizzazione nella cache non distorcesse potenzialmente i risultati)
Maggiori dettagli sui linguaggi interpretati su wikipedia.
Come Stephane ha giustamente sottolineato nei commenti, il tuo chilometraggio può variare a causa dellimplementazione di grep e awk che usi, del sistema operativo su cui si trova e del set di caratteri che hai stanno elaborando.
Commenti
- Senza dire quale implementazione di grep o awk ‘ stai utilizzando e su quale architettura del computer e con quale set di caratteri di sistema, questi tempi hanno poco valore.
- il secondo comando utilizzerà anche il nuovo versione cache. Non dubito che grep sia più veloce ma non tanto quanto mostrano i tuoi numeri.
- (quindi eseguire awk, grep, awk, grep e pubblicare i risultati dal secondo set di awk e grep 🙂 e FYI , Vivo in una locale UTF8.
- Abbastanza divertente, con gli strumenti BSD (su un Mac), awk (31.74s) è leggermente più veloce di sed (33.34s), che è leggermente più veloce di grep ( 34.21s). Gnu awk li possiede tutti a 5.24s, io non ‘ t devo testare gnu grep o sed.
- grep dovrebbe essere leggermente più veloce perché awk fa di più con ciascuno riga di input piuttosto che cercare unespressione regolare in esso, ad es se si fa riferimento a un campo nello script (che ‘ non in questo caso) awk dividerà ogni riga di input in campi in base al valore del separatore di campo e popolerà le variabili incorporate. ma con quello che hai postato non dovrebbe esserci quasi alcuna differenza. Di gran lunga la differenza più importante tra grep e awk rispetto alle espressioni regolari corrispondenti è che grep cerca nellintera riga una stringa corrispondente mentre awk può cercare campi specifici e quindi fornire più precisione e meno false corrispondenze.
Risposta
Usa lo strumento più specifico ed espressivo. Lo strumento che meglio si adatta al tuo caso duso è probabilmente il più veloce.
Come guida approssimativa:
- stai cercando le righe che corrispondono a una sottostringa o regexp? Utilizzare grep.
- selezionando determinate colonne da un file delimitato semplicemente? Usa cut.
- eseguire sostituzioni basate su schemi o … altre cose che sed può ragionevolmente fare? Usa sed.
- hai bisogno di una combinazione dei 3 precedenti, o della formattazione printf, o di loop e branch generici? Usa awk.
Commenti
- +1 eccetto utilizzare
perl
invece diawk
. se hai bisogno di qualcosa di più complicato di grep / cut / sed, allora è probabile che awk non ‘ sia abbastanza e che tu abbia bisogno di qualcosa ” pieno -blown ” - @sds perché non python invece
- @RetroCode: python è più ” uso generale ” rispetto a perl; lequivalente di una riga sarà probabilmente molto più lungo.
- @sds no, non ‘ hai bisogno di perl a meno che tu non ‘ sta per fare qualcosa di diverso dallelaborazione del testo. awk va benissimo per le cose di elaborazione del testo che ‘ è più complicato di grep / cut / sed e come bonus è di serie su tutte le installazioni UNIX, a differenza di perl.
Risposta
Quando cerchi solo stringhe e la velocità è importante, dovresti quasi sempre utilizzare grep
. È più veloce di awk
quando si tratta di ricerche grossolane.
source Le differenze funzionali e di prestazioni di sed, awk e altre utilità di analisi Unix
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
Commenti
- Grazie per questa bella panoramica di tutti questi programmi. Fa davvero luce nelloscurità.
- ~ headtilt ~ PHP è lì ma Perl non è ‘ t?
- A quale
grep
e aawk
ti riferisci? - ‘ non è giusto nei confronti delle altre utilità che grep sta solo cercando e che stanno anche sostituendo.
- Questi sono numeri completamente fasulli. Parliamo di confrontare mele e arance: ‘ è come dire che puoi solo trovare una nuova auto sul sito web A in 5 secondi mentre puoi trovare unauto , negozia un prezzo, ottieni un prestito e acquista lauto sul sito B in 1 ora, quindi il sito A è più veloce del sito B. Larticolo che hai citato è completamente sbagliato ‘ dichiarazioni di velocità di esecuzione relativa tra grep, sed e awk e dice anche
awk ... has PCRE matching for regular expressions
che è completamente falso.
Risposta
Anche se sono daccordo che in teoria grep
dovrebbe essere più veloce di awk
, in pratica, YMMV in quanto dipende molto dallimplementazione che usi.
qui confrontando grep e awk di busybox 1.20.0 “, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 su Debian / Linux 7.0 amd64 (con glibc 2.17) in una locale UTF-8 su un file da 240 MB di 2,5 milioni di righe di caratteri solo ASCII.
$ 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 il C locale, solo GNU grep ottiene una spinta significativa e diventa più veloce di mawk
.
Anche il set di dati, il tipo di regexp può fare una grande differenza. Per le espressioni regolari, awk
deve essere confrontato con grep -E
in quanto awk
“s regexps sono RE estese .
Per questo set di dati, awk
potrebbe essere più veloce di grep
su sistemi basati su busybox o sistemi in cui mawk
è limpostazione predefinita awk
e la locale predefinita è basata su UTF-8 (IIRC, era il caso in Ubuntu).
Risposta
In poche parole, grep
fa una cosa solo come molti altri strumenti UNIX e quella “abbina una linea al modello dato e lo fa bene. Daltra parte, awk
è uno strumento più sofisticato in quanto è un linguaggio di programmazione completo definito dallo standard POSIX con caratteristiche tipiche come variabili, array, espressioni, funzioni o istruzioni di controllo per la scansione di pattern e in lavorazione.
Secondo me, dipende dallimplementazione come si comportano entrambi gli strumenti in caso di pattern matching e dalla dimensione di alcuni input che si desidera elaborare. Mi aspetterei che grep sia solitamente più efficiente di awk in quanto fa solo la corrispondenza. Ma non puoi scrivere con grep un codice semplice per eseguire attività più complesse come lulteriore elaborazione di record abbinati, calcoli o risultati di stampa senza utilizzare altri strumenti.
time
per calcolare il tempo necessario per eseguire il comando. Es:time ls -l
.