Um ein bestimmtes Muster zu erfassen, awk und grep kann verwendet werden. Warum sollten wir eins über das andere verwenden? Was ist schneller und warum?

Wenn ich eine Protokolldatei hätte und ein bestimmtes Muster abrufen wollte, könnte ich eine der folgenden Aktionen ausführen:

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

oder

grep "pattern" /var/log/messages 

Ich habe kein Benchmarking durchgeführt, daher würde ich es nicht wissen. Kann jemand das näher erläutern? Es ist großartig, das Innenleben dieser beiden Tools zu kennen.

Kommentare

  • Stellen Sie jedem Befehl, auch Shell-Skripten, die time, um festzulegen, wie lange es dauert, den Befehl auszuführen. Beispiel: time ls -l.

Antwort

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, wobei grep ein kompiliertes C-Code-Programm ist (das zusätzlich optimiert ist, um Muster in Dateien zu finden). .

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

Weitere Details zu interpretierten Sprachen auf Wikipedia.

Wie Stephane in den 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 verwendeten Zeichensatzes variieren werden verarbeitet.

Kommentare

  • Ohne zu sagen, welche grep- oder awk-Implementierung Sie ‚ verwenden und aktivieren Welche Computerarchitektur und mit welchem Systemzeichensatz, diese Timings haben wenig Wert.
  • Der zweite Befehl verwendet auch den neuen zwischengespeicherte Version. Ich bezweifle nicht, dass grep schneller ist, aber nicht so viel, wie Ihre Zahlen zeigen.
  • (daher awk, grep, awk, grep ausführen und die Ergebnisse aus dem zweiten Satz von awk und grep veröffentlichen 🙂 und FYI Ich lebe in einem UTF8-Gebietsschema.
  • 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.24 Uhr, ich habe ‚ kein gnu grep oder sed zum Testen.
  • grep sollte etwas schneller sein, da awk mit jedem etwas mehr macht Eingabezeile als nur nach einem regulären Ausdruck darin suchen, z Wenn im Skript auf ein Feld verwiesen wird (was in diesem Fall ‚ nicht der Fall ist), teilt awk jede Eingabezeile basierend auf dem Feldtrennwert in Felder auf und füllt integrierte Variablen. Aber mit dem, was Sie gepostet haben, sollte es fast keinen Unterschied geben. Bei weitem ist der wichtigste Unterschied zwischen grep und awk bei übereinstimmenden regulären Ausdrücken, dass grep die gesamte Zeile nach einer übereinstimmenden Zeichenfolge durchsucht, während awk bestimmte Felder durchsuchen kann und so mehr Präzision und weniger falsche Übereinstimmungen bietet.

Antwort

Verwenden Sie das spezifischste und ausdrucksstärkste Werkzeug. Das Tool, das am besten zu Ihrem Anwendungsfall passt, ist wahrscheinlich das schnellste.

Als grobe Richtlinie:

  • Suchen nach Zeilen, die zu einem Teilstring oder einem regulären Ausdruck passen? Verwenden Sie grep.
  • Wählen Sie bestimmte Spalten aus einer einfach begrenzten Datei aus. Verwenden Sie cut.
  • , um musterbasierte Substitutionen durchzuführen oder … andere Dinge, die sed vernünftigerweise tun kann? Verwenden Sie sed.
  • Benötigen Sie eine Kombination der oben genannten 3 oder printf-Formatierung oder Allzweckschleifen und -zweige? Verwenden Sie awk.

Kommentare

  • +1, außer dass Sie perl anstelle von awk. Wenn Sie etwas Komplizierteres als grep / cut / sed benötigen, ist die Wahrscheinlichkeit groß, dass ‚ nicht ausreicht und Sie etwas “ voll benötigen -blown “
  • @sds warum nicht stattdessen Python
  • @RetroCode: Python ist mehr “ Allzweck “ als Perl; Der entsprechende Einzeiler wird wahrscheinlich viel länger sein.
  • @sds nein, Sie ‚ benötigen kein Perl, es sei denn, Sie ‚ Ich werde etwas anderes als Textverarbeitung tun. awk ist in Ordnung für die Textverarbeitung, die ‚ komplizierter als grep / cut / sed ist und als Bonus bei allen UNIX-Installationen im Gegensatz zu Perl als Standard enthalten ist.

Antwort

Wenn Sie nur nach Zeichenfolgen und Geschwindigkeit suchen, sollten Sie fast immer grep. Es ist um Größenordnungen schneller als awk, wenn es nur um die 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 

Kommentare

  • Vielen Dank für diesen schönen Überblick über all diese Programme. Es wirft wirklich Licht in die Dunkelheit.
  • ~ headtilt ~ PHP ist dort eingeschaltet, aber Perl ist nicht ‚ t?
  • Auf welche grep und auf welche awk beziehen Sie sich?
  • Es ‚ ist nicht wirklich fair gegenüber den anderen Dienstprogrammen, die grep nur sucht und die sie auch ersetzen.
  • Das sind völlig falsche Zahlen. Sprechen Sie über den Vergleich von Äpfeln und Orangen – ‚ bedeutet, dass Sie nur in 5 Sekunden ein neues Auto auf Website A finden können, während Sie ein Auto finden können , verhandeln Sie einen Preis, erhalten Sie einen Kredit und kaufen Sie das Auto in 1 Stunde vor Ort B. Daher ist Standort A schneller als Standort B. Der von Ihnen zitierte Artikel ist völlig falsch darin ‚ s Aussagen zur relativen Ausführungsgeschwindigkeit zwischen grep, sed und awk und es wird auch awk ... has PCRE matching for regular expressions angegeben, was einfach völlig falsch ist.

Antwort

Ich stimme zwar zu, dass grep theoretisch schneller sein sollte als awk In der Praxis hängt YMMV stark von der von Ihnen verwendeten Implementierung ab.

Hier werden grep und awk von Busybox 1.20.0, GNU grep 2.14, mawk 1.3.3 und GNU awk 4.0.1 verglichen Debian / Linux 7.0 amd64 (mit glibc 2.17) in einem UTF-8-Gebietsschema in einer 240-MB-Datei mit 2,5 Millionen Zeilen mit 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 

In die C. Gebietsschema, nur GNU grep erhält einen signifikanten Schub und wird schneller als mawk.

Der Datensatz und der Typ des regulären Ausdrucks können ebenfalls einen großen Unterschied machen. Für reguläre Ausdrücke sollten awk mit grep -E verglichen werden, da die regulären Ausdrücke von awk erweiterte REs sind

Für diesen Datensatz kann awk schneller sein als grep auf Busybox-basierten Systemen oder Systemen mit mawk ist die Standardeinstellung awk und das Standardgebietsschema basiert auf UTF-8 (IIRC, dies war früher in Ubuntu der Fall).

Antwort

Kurz gesagt, grep macht nur eine Sache wie viele andere UNIX-Tools und das „s passt eine Linie an das gegebene Muster an und es macht es gut. Andererseits ist awk ein komplexeres Tool, da es sich um eine vollständige Programmiersprache handelt, die vom POSIX-Standard definiert wird und typische Merkmale wie Variablen, Arrays, Ausdrücke, Funktionen oder Steueranweisungen für das Scannen von Mustern und wird bearbeitet.

Meiner Meinung nach hängt es von der Implementierung ab, wie beide Tools im Falle eines Mustervergleichs 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 Matching macht. 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 auszuführen, ohne andere Tools zu verwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.