Wie kann ich eine bestimmte Anzahl von Zeilen lesen, nachdem ich Text gefunden habe?
Z.B.:
Lesen Sie die nächsten 2 Zeilen, nachdem Sie "Unix" gefunden haben:
Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9
Ergebnis kann sein:
Test 5
Test 6
Hinweis: Das "Unix" im letzten Beispiel ist ein Argument und kann daher ein beliebiger anderer Text sein.
Was ich habe:
Ich habe immer noch keine Ideen mehr, brauche nur ein Licht. Denken Sie daran, ein anderes Skript zu erstellen, um dies zu tun.
$
Zeichen am Anfang meiner Antwort eine Shell-Eingabeaufforderung ist und nicht Teil desawk
Befehls.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
Eine
grep
Lösung:Erläuterung:
-A
bedeutet: Drucken Sie die nächsten beiden Zeilen nach dem Spiel ausOder
awk:
Erläuterung: Diese Anweisung sucht in line (
$0=="UNIX"
) nach UNIX . Wenn das gegeben ist, bekommt es den nächsten in seinen buffer (getline
) und druckt den buffer (print
). Dies wird zweimal durchgeführt.Oder verwenden Sie
sed
:Erläuterung: Das sucht nach UNIX (
/^UNIX$/
). Wenn dies gefunden wird, wird das Teil in der Datei ausgeführt{...}
.n
bedeutet weiter,p
bedeutet drucken. Dies geschieht ebenfalls doppelt so häufig.quelle
getline; print;
Teil in derawk
Anweisung oder denn;p;
Teil in dersed
Anweisung wiederholen .grep -A100 -P '^UNIX$' file | tail -n +2
. Der Endteil besteht darin, das erste Pfandrecht zu entfernen. In den anderen (sed, awk) müssten Sie Schleifen schreiben, was es weniger einfach macht.Die Manpage von grep beschreibt die Option folgendermaßen:
quelle
UNIX
in der Ausgabe gedruckt .UNIX
, leiten Sie es antail
:[...] | tail -n +1
oder ansed
:[...] | sed '1d'
.tail
undsed '1d'
Vorschläge funktionieren nur dann korrekt, wenn sieUNIX
nur einmal im Eingabetext erscheinen. Alle anderen Antworten ermöglichen mehrere Vorkommen. Es könnte besser sein, vorzuschlagen... | grep -v UNIX
. Zugegeben, dies wird chaotisch, wenn esUNIX
in den Zeilen 15 und 17 erscheint.sed
mit irgendeiner Form geschehen könntesed '/UNIX/d;n;n;p/' /path/to/file
, die ich gerade herausgearbeitet und als Antwort eingereicht habe.Dies scheint den Trick gut zu machen:
Konzeptioneller Beweiß:
quelle
for
Schleife ist nicht erforderlich.Sie können verwenden
ex
:wo:
1,/UNIX/d
- Entfernt Text nach dem Match%p
- druckt Pufferq!
- Beenden, ohne Änderungen an der Datei zu speichern (wq
zum Bearbeiten an Ort und Stelle verwenden)quelle