@ Ed Morton: Ich stimme dir hier nicht zu. Ich fand es sed
sehr nützlich und einfach (sobald Sie das Konzept des Musters verstanden haben und Puffer halten), eine elegante Methode für das mehrzeilige Greppen zu finden.
Nehmen wir zum Beispiel eine Textdatei mit Hostnamen und einigen Informationen zu jedem Host, mit viel Müll dazwischen, den ich nicht interessiere.
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Für mich würde ein awk-Skript, um nur die Zeilen mit dem Hostnamen und der entsprechenden info
Zeile abzurufen, etwas mehr dauern, als ich mit sed tun kann:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
Ausgabe sieht aus wie:
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(Beachten Sie, dass dies Host: foo1
in der Ausgabe zweimal vorkommt.)
Erläuterung:
-n
Deaktiviert die Ausgabe, sofern nicht ausdrücklich gedruckt
- erste Übereinstimmung, findet und legt die
Host:
Zeile in den Haltepuffer (h)
- Bei der zweiten Übereinstimmung wird die nächste Info: -Zeile gefunden, aber zuerst wird die aktuelle Zeile (x) im Musterpuffer mit dem Haltepuffer
Host:
ausgetauscht und die Zeile gedruckt (p) . Anschließend wird die Info: -Zeile erneut ausgetauscht (x) und gedruckt (p).
Ja, dies ist ein vereinfachtes Beispiel, aber ich vermute, dass dies ein häufiges Problem ist, das von einem einfachen Einzeiler schnell behoben wurde. Für viel komplexere Aufgaben, bei denen Sie sich nicht auf eine bestimmte, vorhersehbare Reihenfolge verlassen können, ist awk möglicherweise besser geeignet.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'