Ich betrete die Welt von Linux und benutze bei der Arbeit grep
immer mehr. Auf diese Weise stelle ich fest, dass es manchmal nicht ausreicht, was ich will.
Ich hatte vor grep
ein 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 grep
und viel Zeit verbringe, wenn ich das hätte tun awk
und Zeit sparen können?
less
grep
sed
awk
grep
sed
sed
awk
Antworten:
sed
undawk
sind Obermengen vongrep
, gibt es Dinge, die leichter mit dem einen oder anderen zu tun sind.grep foo
kann geschrieben werdensed '/foo/!d'
oderawk /foo/
, aber beachten Sie:grep -i foo
Es müsste sein,sed '/[fF][oO][oO]/!d'
wenn Sie nicht-standardmäßige Erweiterungen wie GNUs in Betracht ziehen möchtensed '/foo/I!d'
. Oder mitawk
: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
grep
ist ein einfaches Werkzeug, verfügt jedoch über sehr spezielle Betriebsmodi, die schwerer zu reproduzieren sind,awk
odersed
: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"])'
mitawk
, keine direkte Entsprechung mitsed
).grep -r
für die rekursive Suchegrep -P
/pcregrep
für perlähnliche reguläre Ausdrücke (einigesed
Implementierungen unterstützen perlähnliche reguläre Ausdrücke, jedoch nicht die wichtigsten)grep -o
, um den übereinstimmenden Teil zurückzugeben (mehrere Zeilenawk
odersed
dasselbe zu tun)grep -A/B/C
zur Rückkehr Kontext rund um das Spiel (wieder schmerzhaft in ähnlicher Weise zu tun , mitsed
oderawk
)sed
s/foo/bar/
:sed
'ss
Befehl hat Funktionen, die schwer zu implementieren sind,awk
wie:s/foo\(.*\)bar/\1/g
: capturing (obwohl GNU awk dafür einegensub()
Erweiterung hat)s/foo/bar/3
: Ersetze das 3. Vorkommen in jeder Zeileawk
jetzt auch von GNU unterstützt wird ).awk
awk
ist die am meisten funktionsreiche der drei.perl
perl
Als 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 diesesed
/awk
obsolet macht).Das Beherrschen
perl
der Textverarbeitung ist ein großer Vorteil. Ich würde empfehlen, etwas Zeit damit zu verbringen, bevor Sie sichsed
zum 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
grep
odersed
Implementierungen, 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 ...quelle
awk
viel schneller ist alsgrep
.mawk
ist 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)