Wie kann ich eine bestimmte Anzahl Zeilen lesen, nachdem ich einen Text gefunden habe?
Z.B.:
Lesen Sie die nächsten 2 Zeilen, nachdem Sie „Unix“ gefunden haben unter:
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: „Unix“ im letzten Beispiel ist ein Argument und könnte daher jeder andere Text sein.
Was ich habe:
Mir gehen immer noch die Ideen aus, ich brauche nur ein Licht. Ich denke darüber nach, dafür ein weiteres Skript zu erstellen.
Antwort1
Eine grep
Lösung:
grep -A2 -P '^UNIX$' file
Erläuterung: -A
bedeutet: Drucke die nächsten zwei Zeilen nach dem Match
Oderawk:
awk '$0=="UNIX"{getline; print; getline; print}' file
Erläuterung:Suche in der Zeile ( ) nach UNIX $0=="UNIX"
. Wenn gefunden, hole die nächste Zeile in den Puffer ( getline
) und drucke den Puffer ( print
). Dies wird zweimal durchgeführt.
Oder verwenden Sie sed
:
sed -n '/^UNIX$/{n;p;n;p}' file
Erläuterung:Suche nach UNIX ( /^UNIX$/
). Wenn gefunden, führe den Teil im {...}
. aus n
, der als nächstes bedeutet, p
und drucke. Dies wird auch zweimal durchgeführt.
Antwort2
Eine awk
Lösung:
$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
Erläuterung
/^UNIX$/{i=1;next}
: Wenn wir sehenUNIX
, setzen wir die Variablei = 1
und verarbeiten den nächsten Input.Wenn die Variable
i
gesetzt ist (was wir gesehen habenUNIX
),i && i++ <= 2
wird sie erst in den nächsten beiden Zeilen nach als wahrer Wert ausgewertetUNIX
, wasawk
zur Ausführung der Standardaktion führtprint $0
.Vorher war nicht definiert und begann in der 3. Zeile nach
UNIX
mit einem Wert größer als 2, wodurch der Ausdruck als „false“ ausgewertet wurde und nichts geschah.i
UNIX
i
i && i++ <= 2
awk
Antwort3
grep -A 2 UNIX file.txt
Die Manpage von grep beschreibt die Option folgendermaßen:
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing -- between contiguous groups of
matches.
Antwort4
Sie können Folgendes verwenden ex
:
ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin
Wo:
1,/UNIX/d
-entfernt Text nach Übereinstimmung%p
- Druckt den Pufferq!
- Beenden, ohne die Änderungen an der Datei zu speichern (wq
zum Bearbeiten direkt vor Ort verwenden)