Grep vs awk verwenden

17

Erfassen eines bestimmten Musters awkund grepkann verwendet werden. Warum sollten wir eins übereinander verwenden? Was ist schneller und warum?

Wenn ich eine Protokolldatei hätte und ein bestimmtes Muster aufnehmen möchte, könnte ich eine der folgenden Aktionen ausführen

awk '/pattern/' /var/log/messages

oder

grep 'pattern' /var/log/messages

Ich habe noch kein Benchmarking durchgeführt, also würde ich es nicht wissen. Kann das jemand ausarbeiten? Es ist großartig, das Innenleben dieser beiden Werkzeuge zu kennen.

holasz
quelle
Vor jedem Befehl, auch vor Shell-Skripten, muss der timeBefehl angegeben werden, wie lange die Ausführung des Befehls dauert. Bsp .: time ls -l.
Bulrush

Antworten:

26

grep wird höchstwahrscheinlich schneller sein:

# 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 ist eine interpretierte Programmiersprache, in der grep ein kompiliertes C-Code-Programm ist (das zusätzlich zum Auffinden von Mustern in Dateien optimiert ist).

(Hinweis - Ich habe beide Befehle zweimal ausgeführt, damit das Caching die Ergebnisse möglicherweise nicht verzerrt.)

Weitere Details zu interpretierten Sprachen auf Wikipedia.

Wie Stephane in seinen Kommentaren zu Recht ausgeführt hat, kann Ihr Kilometerstand aufgrund der Implementierung des von Ihnen verwendeten grep und awk, des Betriebssystems und des von Ihnen verarbeiteten Zeichensatzes variieren.

Drav Sloan
quelle
2
Ohne zu sagen, welche grep- oder awk-Implementierung Sie verwenden und auf welcher Computerarchitektur und mit welchem ​​Systemzeichensatz, haben diese Timings wenig Wert.
Stéphane Chazelas
1
Der zweite Befehl verwendet auch die neu zwischengespeicherte Version. Ich bezweifle nicht, dass grep schneller ist, aber nicht so viel, wie Ihre Zahlen zeigen.
Exussum
(daher wird awk, grep, awk, grep ausgeführt und die Ergebnisse aus der zweiten Gruppe von awk und grep veröffentlicht :) Und zu Ihrer Information, ich lebe in einem UTF8-Gebietsschema.
Drav Sloan
1
Komischerweise ist awk (31,74 s) mit den BSD-Tools (auf einem Mac) etwas schneller als sed (33,34 s), was etwas schneller ist als grep (34,21 s). Gnu awk besitzt sie alle um 5.24s, ich habe kein Gnu grep oder sed zum Testen.
Kevin
1
grep sollte etwas schneller sein, da awk mit jeder Eingabezeile mehr macht, als nur nach einem regulären Ausdruck zu suchen, z. B. wenn im Skript auf ein Feld verwiesen wird (was in diesem Fall nicht der Fall ist) Feld-Trennzeichen-Wert und füllt eingebaute Variablen. aber mit dem was du gepostet hast sollte es fast keinen unterschied geben. Bei weitem der wichtigste Unterschied zwischen grep und awk WRT Matching regexps ist , dass grep sucht die ganze Linie für eine passende String während awk bestimmten Bereichen suchen können und so mehr Präzision und weniger falsche Übereinstimmungen liefern.
Ed Morton
14

Verwenden Sie das spezifischste und aussagekräftigste Werkzeug. Das für Ihren Anwendungsfall am besten geeignete Tool ist wahrscheinlich das schnellste.

Als grobe Richtlinie:

  • Suchen Sie nach Zeilen, die einer Teilzeichenfolge oder einem regulären Ausdruck entsprechen? Verwenden Sie grep.
  • Auswahl bestimmter Spalten aus einer einfach begrenzten Datei? Verwenden Sie schneiden.
  • musterbasierte Substitutionen durchführen oder ... andere Dinge, die man vernünftigerweise tun kann? Verwenden Sie sed.
  • Benötigen Sie eine Kombination aus den obigen 3 oder printf-Formatierungen oder Allzweckschleifen und -verzweigungen? Benutze awk.
Nutzlos
quelle
+1 außer verwenden perlstatt awk. wenn du etwas komplizierteres als grep / cut / sed brauchst, dann sind die Chancen groß, dass es nicht ausreicht und du brauchst etwas "
Ausgereiftes
@sds warum nicht stattdessen Python
RetroCode
@RetroCode: Python ist mehr "Allzweck" als Perl; Der äquivalente Einzeiler wird wahrscheinlich viel länger sein.
SDS
3
@sds nein, du brauchst kein Perl, es sei denn, du machst etwas anderes als Textverarbeitung. awk ist in Ordnung für die Textverarbeitung, die komplizierter ist als grep / cut / sed und im Gegensatz zu Perl standardmäßig in allen UNIX-Installationen enthalten ist.
Ed Morton
10

Wenn Sie nur nach Zeichenfolgen suchen und es auf die Geschwindigkeit ankommt, sollten Sie fast immer verwenden grep. Es ist um Größenordnungen schneller als awkwenn es nur um grobe Suche geht.

source Die Funktions- und Leistungsunterschiede von sed, awk und anderen Unix-Parsing-Dienstprogrammen

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
slm
quelle
1
Vielen Dank für diesen schönen Überblick über all diese Programme. Es wirft wirklich Licht in die Dunkelheit.
Holasz
1
~ headtilt ~ PHP ist da, Perl aber nicht?
Izkata
@Izkata - Ich dachte das Gleiche, als ich diesen Tisch vor einiger Zeit sah.
SLM
1
Es ist nicht wirklich fair zu den anderen Utensilien, die grep nur sucht und die sie auch ersetzen.
Kevin
1
Das sind völlig falsche Zahlen. Sprechen Sie über den Vergleich von Äpfeln und Orangen - es ist so, als ob Sie in nur 5 Sekunden ein neues Auto auf der Website A finden können, während Sie in 1 Stunde ein Auto auf der Website B finden, einen Preis aushandeln, einen Kredit aufnehmen und das Auto kaufen können Daher ist Site A schneller als Site B. Der Artikel, den Sie zitiert haben, ist in seinen Aussagen zur relativen Ausführungsgeschwindigkeit zwischen grep, sed und awk völlig falsch awk ... has PCRE matching for regular expressions.
Ed Morton
5

Ich stimme zwar zu, dass YMMV theoretisch grepschneller sein sollte als awkin der Praxis, da dies in hohem Maße von der von Ihnen verwendeten Implementierung abhängt.

Hier wird das grep und awk von busybox 1.20.0 verglichen, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 unter Debian / Linux 7.0 amd64 (mit glibc 2.17) in einem UTF-8-Gebietsschema auf einer 240MB-Datei mit 2,5M Zeilen Nur ASCII-Zeichen.

$ 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 

Im C-Gebietsschema erhält nur GNU grep einen signifikanten Schub und wird schneller als mawk.

Der Datensatz und die Art des regulären Ausdrucks können ebenfalls einen großen Unterschied machen. Für reguläre Ausdrücke awksollten verglichen werden mit, grep -Eda awkreguläre Ausdrücke erweiterte REs sind.

Dieser Datensatz ist awkmöglicherweise schneller als grepauf Systemen mit vielbeschäftigter Box oder auf Systemen, auf denen mawkdie Standardeinstellung awkund das Standardgebietsschema UTF-8-basiert ist (IIRC war früher in Ubuntu der Fall).

Stéphane Chazelas
quelle
2

Kurz gesagt, grepmacht eine Sache nur so viele andere UNIX-Tools, und das stimmt mit einer Linie mit dem gegebenen Muster überein, und das macht es auch gut. Auf der anderen Seite awkist es ein komplexeres Tool, da es eine vollständige Programmiersprache ist, die durch den POSIX-Standard definiert ist und typische Merkmale wie Variablen, Arrays, Ausdrücke, Funktionen oder Steueranweisungen für das Scannen und Verarbeiten von Mustern enthält.

Meiner Meinung nach hängt es von der Implementierung ab, wie beide Tools bei der Mustererkennung funktionieren, und von der Größe einiger Eingaben, die Sie verarbeiten möchten. Ich würde erwarten, dass grep normalerweise effizienter ist als awk, da es nur das Matching tut. Sie können jedoch keinen einfachen Code mit grep schreiben, um komplexere Aufgaben wie die Weiterverarbeitung übereinstimmender Datensätze, die Berechnung oder das Drucken von Ergebnissen ohne Verwendung anderer Tools auszuführen.

dsmsk80
quelle