Text zwischen Schlüsselwörtern in der Protokolldatei abrufen

7

Wenn ich eine Protokolldatei habe und nur den Text zwischen 1234 und 9876 in eine andere Datei kopieren möchte, wie kann ich das einfach tun?

Wenn ich eine Textdatei wie diese habe:

idsfsvcvs sdf sdf e e  sd vs d s g sg  s vc  d

slkdfnls 1234 keep me text 9876 das a g w eg dsf sd fsdf
sdfs fs dfsdf
sdfsdf sdf
sdf s fs
dfsf ds

Ich möchte so etwas tun

$ getinfo "1234" "9876" Protokoll

$ cat log

Behalte mich im Text

Dunkeler Zauberer
quelle

Antworten:

10

Eine Linie von sed kann dies für Sie tun:

sed -n 's/.*1234 \(.*\)9876.*/\1/p' textfile.txt > log

Kenny Rasschaert
quelle
2

Normalerweise können Sie dies mit grep und dem Parameter -o tun.

-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 

so wäre es so etwas wie:

 grep -Po '1234.*9876' >> log

Ich bin mir übrigens nicht 100% sicher über den Regex, ich habe ihn nicht getestet

Goez
quelle
@Geoz grep -Po '1234. * 9876' Test | awk -F9876 '{print $ 1}' | awk -F1234 '{print $ NF}' wäre für seine Anforderung korrekt
kaji
1

Dies hängt von Ihrem Dateiinhalt ab. Sie können mit etwas Einfachem beginnen wie:

$ grep 1234 logfile | grep 9876 | cut -d ' ' -f 3,4,5

Dies funktioniert für das bereitgestellte Beispiel. Sie können daran arbeiten, um bei Bedarf andere Datenformate abzudecken. Sie können die Ausgabe auch durch Anhängen in eine Datei umleiten> /path/to/output

Khaled
quelle
Dies würde funktionieren, wenn der Dateiinhalt immer der gleiche ist. Aber Sie wissen nicht, dass der Inhalt von "Keep Me Test" immer gleich lang ist
Goez
@Goez: Ich sagte, dass dies für dieses Beispiel funktioniert und entsprechend den möglichen Eingabevorlagen angepasst werden kann. Es ist nicht klar aus der Frage. Können Sie eine Textdatei analysieren, ohne die Vorlage (n) zu kennen?
Khaled
0

Für das, was es wert ist, würde ich Folgendes tun:

  1. grep 1234.*9876 > myfile
  2. vim myfile
  3. :%s/^.*1234// (alles bis 1234 löschen)
  4. :%s/9876.*$// (alles nach und einschließlich 9876 löschen)

Nicht perfekt oder der beste Weg, aber leicht zu merken, wenn Sie oft vim verwenden.

user606723
quelle