Wie lese ich bestimmte Zeilen, nachdem ich einen Text gefunden habe?

Wie lese ich bestimmte Zeilen, nachdem ich einen Text gefunden habe?

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 grepLösung:

grep -A2 -P '^UNIX$' file

Erläuterung: -Abedeutet: 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, pund drucke. Dies wird auch zweimal durchgeführt.

Antwort2

Eine awkLösung:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

Erläuterung

  • /^UNIX$/{i=1;next}: Wenn wir sehen UNIX, setzen wir die Variable i = 1und verarbeiten den nächsten Input.

  • Wenn die Variable igesetzt ist (was wir gesehen haben UNIX), i && i++ <= 2wird sie erst in den nächsten beiden Zeilen nach als wahrer Wert ausgewertet UNIX, was awkzur Ausführung der Standardaktion führt print $0.

  • Vorher war nicht definiert und begann in der 3. Zeile nach UNIXmit einem Wert größer als 2, wodurch der Ausdruck als „false“ ausgewertet wurde und nichts geschah.iUNIXii && i++ <= 2awk

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:

verwandte Informationen