Suchen Sie eine Textzeichenfolge in einer Datei und geben Sie nur den Rest des darauf folgenden Textes aus?

7

Ich finde viele Beiträge in diesem Forum, die damit zu tun haben, verschiedene Werte in einer Textdatei zu finden und Text auszugeben, der sie umgibt. Ich finde jedoch keine "Stream-orientierten".

Ich möchte eine bestimmte Zeichenfolge in einer Datei finden und nur den darauf folgenden Text ausgeben , bis das Ende der Datei erreicht ist. Mit anderen Worten, ich möchte etwas, das sich wie ein Filter verhält, der den Text in einer Datei ignoriert, bis ein bestimmter Zeichenfolgenwert erreicht ist, und von diesem Punkt an Text bis zum Ende der Datei an stdout ausgibt . Ich möchte stdout verwenden, damit ich die Ausgabe in eine Datei leiten kann, wenn ich dies wähle.

Gibt es ein Linux-Textdienstprogramm, das mir dabei hilft, und wenn ja, wie? Oder wenn ich dazu ein Bash-Shell-Skript schreiben muss, welche allgemeinen Schritte und Befehlszeilenprogramme würde ich dazu verwenden?

Beispiel: Eine Beispieldatei unten:

one
two
three
four
five

Angenommen, ich wollte den gesamten Text nach den "drei" ausgeben, damit das Ergebnis lautet:

four
five

HINWEIS: Ich habe diesen scheinbar verwandten Beitrag gefunden, aber wie Sie sehen, ist er ein bisschen chaotisch:

Wie finde ich einen Text und kopiere den Text danach?

Robert Oschler
quelle
Ist "drei" einzigartig? Was ist, wenn mehr als ein Vorkommen vorliegt?
schrodigerscatcuriosity

Antworten:

10

Verwendung awk:

awk 's;/^three$/{s=1}' file

oder

awk 's;$0=="three"{s=1}' file
  • s;druckt die Zeile, wenn die Variable swahr ist. Dies ist das erste Mal, nachdem das Muster / Wort gefunden wurde ...
  • /^three$/{s=1}setzt die Variable sauf true (1), wenn Muster / Wort gefunden wird.
pLumo
quelle
9

Mit GNU sed:

sed 0,/three/d

Beachten Sie, dass Linux ein Kernel ist und keine Dienstprogramme enthält. GNU sedist die sedImplementierung, die häufig auf GNU / Linux-Systemen wie Debian GNU / Linux zu finden ist. GNU ist sedälter als Linux und wurde für die Ausführung auf den meisten Unix-ähnlichen Systemen kompiliert, einschließlich der meisten, auf denen Linux als Kernel ausgeführt wird. Es handelt sich selbst um eine Neuimplementierung von Free, Libre und OpenSource (mit einigen Erweiterungen einschließlich dieser 0Adresse) des UNIX- sedDienstprogramms aus den späten 70er Jahren.

Stéphane Chazelas
quelle
1

Mit POSIX sed können Sie Folgendes tun:

sed -ne '/three/!d;:a;n;p;ba' inp.file

Verwenden von Perl:

perl -lne 'print if 1 <(/three/...eof)' inp.file
Rakesh Sharma
quelle