Wir wissen, dass wir die zweite Spalte der gewünschten Zeile mithilfe dieser beiden Techniken 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
awk
gegenüber der Verwendungcut
und umgekehrt? - Welche Möglichkeiten haben
awk
wircut
und umgekehrt?
awk
grep
performance
cut
Networker
quelle
quelle
echo filename
odercat filename
?Antworten:
Der auffälligste Unterschied zwischen Ihren beiden Zeilen hängt von der Eingabe ab.
cut
nimmt ein einzelnes Zeichen-d
als Feldbegrenzer (der Standardwert ist TAB) und jedes einzelne Vorkommen dieses Zeichens startet ein neues Feld.awk
ist jedoch flexibler. Das Trennzeichen befindet sich in derFS
Variablen 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 (Standard) bedeutet, dass eine beliebige Folge von Leerzeichen geteilt wird. Auchawk
führende Unterdrückt Leerzeichen standardmäßig.Bitte vergleichen Sie:
Hier
awk
teilt sich auf die Reihenfolge der Räume zwischenabc
unddef
währendcut
nimmt jeden Raum als Separator.Was Sie einnehmen, hängt davon ab, was Sie erreichen möchten. Ansonsten würde ich erwarten
cut
, schneller zu sein, da es sich um ein kleineres Einzweckwerkzeug handelt,awk
das eine eigene Programmiersprache hat.quelle
cut
ist wahrscheinlich schneller als Awk alleine , aber es ist nicht so sicher, dassgrep ... | cut
es schneller als reines Awk sein wird.Im Allgemeinen ist ein Werkzeug umso schneller, je spezialisierter es ist. So in den meisten Fällen, können Sie erwarten ,
cut
undgrep
schneller alssed
undsed
als schneller zu seinawk
. Wenn Sie längere Pipelines von einfacheren Werkzeugen mit einem einzigen Aufruf eines komplexeren Werkzeugs vergleichen, gibt es keine Faustregel. Dies ist nur bei großen Eingaben (z. B. Millionen von Zeilen) von Bedeutung. Bei kurzen Eingaben sehen Sie keinen Unterschied.Der Vorteil komplexerer Tools ist natürlich, dass sie mehr können.
Ihre Befehle verwenden unnötigerweise cat. Verwenden Sie stattdessen die Umleitung (insbesondere, wenn Sie sich Gedanken über die Geschwindigkeit machen, obwohl Sie sich wahrscheinlich keine Gedanken über die Geschwindigkeit machen sollten, bis Sie Benchmarks1 ausgeführt haben).
Diese Befehle sind fast gleichwertig. Die Unterschiede sind:
grep -E
haben fast identische Regexp-Syntax (erweiterte reguläre Ausdrücke).cut -d ' '
behandelt jedes einzelne Leerzeichen als Begrenzer. Das Standardtrennzeichen von Awk ist eine beliebige Whitespace-Sequenz, die aus mehreren Leerzeichen, einem Tabulator usw. bestehen kann. Sie können keine willkürlichen Whitespace-Sequenzen als Trennzeichen verwendencut
. Um einzelne Leerzeichen als Trennzeichen in awk zu verwenden, stellen Sie das Feldtrennzeichen auf einen regulären Ausdruck ein, der einem einzelnen Leerzeichen entspricht, mit Ausnahme eines regulären Ausdrucks, der aus einem einzelnen Leerzeichen bestehtawk -F '[ ]' '/WORD/ {print $2}'
.¹ Die erste Regel zur Programmoptimierung: Tun Sie es nicht. Die zweite Regel der Programmoptimierung (nur für Experten!): Tun Sie es noch nicht. - Michael A. Jackson
quelle
Ihr Befehl,
Sie brauchen nicht einmal einen
cat
Befehl. Sie können versuchen,Und der folgende Befehl leitet die Ausgabe von cat zu grep und dann zu cut um,
Höchstwahrscheinlich müssen wir die Ausgabeumleitung vermeiden. Awk erledigt die Aufgabe in einer Zeile,
cut
benötigt jedoch einengrep
Befehl, um nur die Zeilen abzurufen, die ein bestimmtes Wort enthalten, und druckt die Spalte 2 entsprechend dem Trennzeichen.Sie können die Dinge in awk tun, wenn cut nicht funktioniert.
quelle
grep WORD filename
.