it-swarm.com.de

Was sind die genauen Unterschiede zwischen awk und cut with grep?

Wir wissen, dass wir mit diesen beiden Techniken die zweite Spalte der gewünschten Zeile aus einer Datei abrufen können:

awk '/Word/ { print $2 }' filename

oder

grep Word filename| cut -f 2 -d ' '

Meine Fragen sind:

  • Was sind die Unterschiede zwischen den beiden obigen Befehlen?
  • Welches hat die beste Leistung?
  • Was sind die Vorteile der Verwendung von awk gegenüber der Verwendung von cut und umgekehrt?
  • Welche Optionen gibt uns awk gegenüber cut und umgekehrt?
31
Nidal

Der auffälligste Unterschied zwischen Ihren beiden Zeilen hängt von der Eingabe ab. cut nimmt ein einzelnes Zeichen in -d als Feldtrennzeichen (der Standardwert ist TAB), und jedes einzelne Vorkommen dieses Zeichens startet ein neues Feld. awk ist jedoch flexibler. Das Trennzeichen befindet sich in der Variablen FS und kann eine leere Zeichenfolge (jedes Eingabezeichen bildet ein separates Feld), ein einzelnes Zeichen oder ein regulärer Ausdruck sein. Der Sonderfall eines einzelnen Leerzeichens (Standardeinstellung) bedeutet, dass eine beliebige Sequenz von Leerzeichen aufgeteilt wird. Außerdem unterdrückt awk standardmäßig führende Leerzeichen.

Bitte vergleichen Sie:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

Hier teilt awk die Folge von Leerzeichen zwischen abc und def auf, während cut jedes Leerzeichen als Trennzeichen verwendet.

Was Sie nehmen, hängt davon ab, was Sie erreichen möchten. Andernfalls würde ich erwarten, dass cut schneller ist, da es sich um ein kleineres Einzweckwerkzeug handelt, während awk über eine eigene Programmiersprache verfügt.

37
Dubu

Im Allgemeinen ist ein Werkzeug umso schneller, je spezialisierter es ist. In den meisten Fällen können Sie also erwarten, dass cut und grep schneller als sed und sed schneller als awk sind. Wenn Sie längere Pipelines einfacherer Tools mit einem einzigen Aufruf eines komplexeren Tools vergleichen, gibt es keine Faustregel. Dies ist nur bei großen Eingaben von Bedeutung (z. B. Millionen von Zeilen). Bei kurzen Eingaben sehen Sie keinen Unterschied.

Der Vorteil komplexerer Tools besteht natürlich darin, dass sie mehr können.

Ihre Befehle verwenden cat unnötig. Verwenden Sie stattdessen die Umleitung (insbesondere, wenn Sie sich Sorgen um die Geschwindigkeit machen, obwohl Sie sich wahrscheinlich keine Sorgen um die Geschwindigkeit machen sollten, bis Sie Benchmarks ausgeführt haben¹).

<fileName awk '/Word/ { print $2 }'
<fileName grep Word | cut -f 2 -d ' '

Diese Befehle sind fast gleichwertig. Die Unterschiede sind:

  • awk und grep haben nterschiedliche Regexp-Syntaxen . Awk und grep -E haben fast identische Regexp-Syntaxen (erweiterte reguläre Ausdrücke).
  • cut -d ' ' behandelt jedes einzelne Leerzeichen als Trennzeichen. Das Standardtrennzeichen von Awk ist eine beliebige Leerzeichenfolge, die aus mehreren Leerzeichen, einer Registerkarte usw. bestehen kann. Sie können mit cut keine beliebigen Leerzeichenfolgen als Trennzeichen verwenden. Um einzelne Leerzeichen als Trennzeichen in awk zu verwenden, setzen Sie das Feldtrennzeichen auf einen regulären Ausdruck, der einem einzelnen Leerzeichen entspricht, mit Ausnahme eines regulären Ausdrucks, der aus einem einzelnen Leerzeichen besteht (ein Sonderfall, der "beliebige Leerzeichenfolge" bedeutet, d. H. Die Standardeinstellung): awk -F '[ ]' '/Word/ {print $2}'.

¹  Die erste Regel der Programmoptimierung: Tun Sie es nicht. Die zweite Regel der Programmoptimierung (nur für Experten!): Tun Sie es noch nicht. - Michael A. Jackson

Dein Befehl,

cat fileName | awk '/Word/ { print $2 }'

Sie benötigen nicht einmal einen Befehl cat. Sie können versuchen,

awk '/Word/ { print $2 }' filename

Und der folgende Befehl leitet die Ausgabe von cat an grep und dann an cut weiter.

cat fileName | grep Word | cut -f 2 -d ' '

Höchstwahrscheinlich müssen wir eine Umleitung der Ausgabe vermeiden. Awk erledigt die Arbeit in einer Zeile, aber cut benötigt einen grep Befehl, um nur die Zeilen abzurufen, die ein bestimmtes Word enthalten, und druckt die Spalte 2 entsprechend dem Trennzeichen.

Sie können die Dinge in awk tun, wenn der Schnitt nicht funktioniert.

1
Avinash Raj