Verwendung von grep, less, awk, sed [closed]

17

Ich betrete die Welt von Linux und benutze bei der Arbeit grepimmer mehr. Auf diese Weise stelle ich fest, dass es manchmal nicht ausreicht, was ich will.

Ich hatte vor grepein paar Tagen Probleme, und ein Kollege von mir, der ein leitender Linux-Administrator ist, sagte mir, ich solle es verwenden awk. Ich war fassungslos, wie schnell ich ein Ergebnis bekam.

Meine Frage ist also, wann Sie sich entscheiden, eine über der anderen zu verwenden? Welche Fragen kann ich mir stellen, bevor ich zur Arbeit gehe grepund viel Zeit verbringe, wenn ich das hätte tun awkund Zeit sparen können?

frankguthrie
quelle
Dies ist eine gute Frage, aber sie ist wirklich sehr weit gefasst und basiert hauptsächlich auf Meinungen. Um Ihre Frage zu beantworten, hängt die Verwendung von grep im Gegensatz zu awk wirklich davon ab, wie komfortabel Sie awk / sed verwenden. Es gibt ein paar Gründe, warum man dies gegenüber letzterem verwenden sollte, beispielsweise nach etwas Spezifischerem als dem, was grep zu bieten hat, zu suchen oder zu versuchen, Dateien durch einen bestimmten String zu ersetzen / zu bearbeiten (mit sed). Aber auch hier hängt alles von Ihrem Komfortniveau und Ihrer Erfahrung mit awk / sed ab.
Ryekayo
7
Verwenden Sie sehen , eine Datei. Verwenden Sie suchen , durch eine Datei. Verwenden Sie zum Bearbeiten einer Datei. Verwenden Sie over und, wenn die zu verarbeitende Datei eine bestimmte Struktur aufweist (z. B. Spalten). Verwenden Sie über , wenn Sie hauptsächlich mit Linien (wie Löschen oder fügen Sie Textzeilen) beschäftigen möchten. Ich bin sicher, jemand wird eine 20-seitige Antwort schreiben, die vollständiger ist als meine. lessgrepsedawkgrepsedsedawk
Satō Katsura
Hallo Sato, es geht nicht um die Länge, sondern was gesagt wird. Und Sie paar Zeilen sind sehr informativ. Vielen Dank.
Frankguthrie

Antworten:

25

sedund awksind Obermengen von grep, gibt es Dinge, die leichter mit dem einen oder anderen zu tun sind.

grep fookann geschrieben werden sed '/foo/!d'oder awk /foo/, aber beachten Sie:

grep -i fooEs müsste sein, sed '/[fF][oO][oO]/!d'wenn Sie nicht-standardmäßige Erweiterungen wie GNUs in Betracht ziehen möchten sed '/foo/I!d'. Oder mit awk: awk 'tolower($0) ~ /foo/'oder wieder eine GNU - Erweiterung mit: awk -v IGNORECASE=1 /foo/.

Dinge, in denen die verschiedenen Werkzeuge gut sind und die mit den anderen Werkzeugen umständlich sind:

grep

grepist ein einfaches Werkzeug, verfügt jedoch über sehr spezielle Betriebsmodi, die schwerer zu reproduzieren sind, awkoder sed:

  • grep -i für case insensitive matching (siehe oben)
  • grep -Fe "$string"für die Suche nach festen Zeichenfolgen ( export string; awk 'index($0, ENVIRON["string"])'mit awk, keine direkte Entsprechung mit sed).
  • (Nicht-Standard) grep -rfür die rekursive Suche
  • (Nicht-Standard) grep -P/ pcregrepfür perlähnliche reguläre Ausdrücke (einige sedImplementierungen unterstützen perlähnliche reguläre Ausdrücke, jedoch nicht die wichtigsten)
  • (Nicht-Standard) grep -o, um den übereinstimmenden Teil zurückzugeben (mehrere Zeilen awkoder seddasselbe zu tun)
  • (Nicht - Standard) grep -A/B/Czur Rückkehr Kontext rund um das Spiel (wieder schmerzhaft in ähnlicher Weise zu tun , mit sedoder awk)

sed

  • s/foo/bar/: sed's sBefehl hat Funktionen, die schwer zu implementieren sind, awkwie:
  • s/foo\(.*\)bar/\1/g: capturing (obwohl GNU awk dafür eine gensub()Erweiterung hat)
  • s/foo/bar/3: Ersetze das 3. Vorkommen in jeder Zeile
  • (Nicht-Standard): In-Place-Bearbeitung von Dateien (obwohl es awkjetzt auch von GNU unterstützt wird ).

awk

awk ist die am meisten funktionsreiche der drei.

  • gut für den umgang mit zahlen
  • Gut für den Umgang mit in Spalten formatierten Eingaben.
  • Gut zum Extrahieren und Kombinieren von Daten aus verschiedenen Quellen mit ihren assoziativen Arrays.

perl

perlAls praktisches Extraktions- und Reporting-Tool hat es das Beste von allen. Dafür wurde es ursprünglich entwickelt (um das Werkzeug zu sein, das all diese sed/ awkobsolet macht).

Das Beherrschen perlder Textverarbeitung ist ein großer Vorteil. Ich würde empfehlen, etwas Zeit damit zu verbringen, bevor Sie sich sedzum Beispiel die weniger verbreiteten Befehle ansehen.

Performance

Als Faustregel gilt, je spezialisierter das Werkzeug ist, desto effizienter ist es bei der Aufgabe. Dies hängt jedoch auch sehr stark von der Implementierung, der Aufgabe und einigen anderen Faktoren und der Leistung ab. Dies kann zu Kompromissen führen, die möglicherweise berücksichtigt werden müssen.

Zum Beispiel gibt es einige grepoder sedImplementierungen, die sehr schnell sind, aber zum Beispiel keine Multibyte-Zeichen unterstützen, so dass nur US-englischer Text in Mehrbyte-Gebietsschemata korrekt verarbeitet werden kann. Oder sie sind schnell, weil sie mit einem kleinen Puffer fester Länge arbeiten und daher keine willkürlichen Eingaben verarbeiten können ...

Stéphane Chazelas
quelle
Hervorragende Antwort! Kennen Sie die Effizienz der Werkzeuge? Ich bin verwirrt über die Aussage des OP, die awkviel schneller ist als grep.
Pfnuesel
@pfnuesel, das hängt sehr stark von der Implementierung und dem Verwendungsmuster ab. Beispielsweise mawkist bekannt, dass es sehr effizient ist (unterstützt jedoch keine Multibyte-Zeichen, was ein Grund dafür ist, dass es effizienter ist als einige andere Tools)
Stéphane Chazelas