Wie greift man zu einem bestimmten Zeichen oder String?

3383
Sean Patrick Floyd

Ich muss Protokolldaten aus vielen Terrabytes von Protokolldateien extrahieren. Die Sache ist, die Daten, die ich brauche, beginnen und enden mit Mustern, die ich identifizieren kann, aber der Code zwischen 10 und 100 Zeilen kann beliebig sein.

Beispiel:

Start # lots of lines here End 

Derzeit mache ich grep -A 50 "Start", was mir den Start und die 50 Zeilen danach gibt. In fast allen Fällen ist das jedoch mehr oder weniger als ich brauche. Das bedeutet, dass die resultierende Berichtsdatei um Gigabytes größer wird, als sie sein muss, und weniger bedeutet, dass ich nicht die Informationen bekomme, die ich brauche.

Gibt es eine Möglichkeit, mit Standard-Unix / Linux-Tools genau das zu extrahieren, was ich brauche?

2
Was ist ein regulärer Ausdruck? Ярослав Рахматуллин vor 11 Jahren 0

1 Antwort auf die Frage

3
Simon

Versuchen Sie es mit awk:

awk '/^Start/,/^End/' file 

oder wenn Sie lieber sed bevorzugen:

sed -n '/Start/,/End/p' file 
Cool, danke, ich werde es versuchen und dich wissen lassen Sean Patrick Floyd vor 11 Jahren 0
@SeanPatrickFloyd sind Sie herzlich willkommen. Ich habe auch eine Lösung mit sed hinzugefügt. Simon vor 11 Jahren 0
Schöner Code dort. Macht es Ihnen etwas aus zu erklären, wie `sed` in diesem Fall funktioniert? Ich habe versucht, es herauszufinden, indem ich die Manpage auf ss64 durchcheckte und einige Versuchs- und Irrtumsexperimente durchführte. :) Vielen Dank. vor 11 Jahren 0
@Radoo **sed -n** -> Suppresses the default output. **'** -> beginning of the filter command **/Start/** -> regular expression **,** -> separator **/End/** -> regular expression **p** -> Print. Copy the pattern space to the standard output. **'** -> end of the filter **file** -> file name Simon vor 11 Jahren 0
unfortunately, the log files are gzipped, so I have to use a two step version: `zgrep -n -A 140 "Start" http*/p*/some.log.pattern.*.gz | sed -n '/Start/,/End/p' > /tmp/output.txt` but it does work like a charm. Thanks! Sean Patrick Floyd vor 11 Jahren 0
@Simon Nun, ich finde es heraus, konnte aber nichts über das Trennzeichen `,` finden. Die Hilfe sagt nur über '/ regexp / substitution /'. Was für eine Art Zauberei ist das? Wo finde ich eine gründliche Erklärung, wie sed funktioniert? :) vor 11 Jahren 0
@Radoo: Überprüfen Sie den Abschnitt "Adressen" der [Manpage] (http://linux.die.net/man/1/sed). Dieser sed-Befehl verwendet zwei Adressen (die beide reguläre Ausdrücke sind), um auszuwählen Zeilenbereiche, auf die der Befehl "p" angewendet werden soll. Gordon Davisson vor 11 Jahren 1