Sed / Awk speichert Text zwischen Mustern, wenn er Zeichenfolge enthält

572
wtk

Ich habe ein Problem mit Mails. Ich muss alle Nachrichten zwischen 2 Personen erhalten: somebody1@domain.comund person@domain.com.

Die file:

From: somebody1@domain.com to: person@domain.com <body of the message1>  From: somebody2@domain.com to: person@domain.com <body of the message1>  From: somebody1@domain.com to: person@domain.com <body of the message1>  From: somebody3@domain.com to: person@domain.com <body of the message1>  From: somebody5@domain.com to: person@domain.com <body of the message1> 

Ich habe versucht folgendes zu verwenden sed:

sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt 

Als Ergebnis bekam ich alle Mails von jemandem1 zur test.txtAblage.

Frage ist: Wie sollte die Struktur aussehen sed, um nur Mails zwischen jemandem1 und einer Person zu erhalten?

2

2 Antworten auf die Frage

1
chaos

Mit sed:

sed -n '/^From: somebody1@domain.com/}' file 

  • /^From: somebody1@domain.com/: suchen Sie zuerst nach der From:E-Mail-Adresse
    • h; Speichern Sie diese Zeile im Speicherbereich.
    • n;Lade die nächste Zeile (die to:Zeile).
  • /^to: person@domain.com/: Suche nach der to:E-Mail-Adresse
    • H; Hängen Sie diese Zeile an den Speicherplatz an.
    • g; Kopieren Sie den Haltebereich in den Musterbereich.
    • p; Drucken Sie den Musterbereich.
    • :x;Setze ein Label namens x.
    • n; Laden Sie die nächste Zeile (den E-Mail-Text)
    • p; Drucken Sie diese Zeile aus.
    • s/.// Ersetzen Sie in dieser Zeile (ersetzen Sie einfach ein Zeichen) ...
    • tx... dass der tBefehl überprüfen kann, ob die Ersetzung erfolgreich ist (wenn die Zeile nicht leer ist, wie am Ende des E-Mail-Texts). Wenn ja, springen Sie zurück zum Etikett xund wiederholen Sie den Vorgang, bis eine leere Zeile angezeigt wird. Andernfalls springen Sie zum Ende des Skripts.

Die Ausgabe:

From: somebody1@domain.com to: person@domain.com <body of the message1>  From: somebody1@domain.com to: person@domain.com <body of the message1> 
Wahrscheinlich können Sie ohne das erste "p;" eine sauberere Ausgabe erhalten. Nur um eine Liste von isolierten Übereinstimmungen mit "Von: somebody1 @ domain.com" zu vermeiden, die nicht von der zweiten Personenübereinstimmung und dem Block des Buchstabens gefolgt werden. Hastur vor 9 Jahren 0
@Hastur Guter Hinweis, ich habe es korrigiert, jetzt werden keine isolierten Übereinstimmungen mehr gedruckt chaos vor 9 Jahren 0
Vielen Dank dafür. Ich möchte noch eine andere Frage stellen: Die Sache ist, dass ich im Gegenzug den gesamten Nachrichtentext (der neue Zeilenzeichen enthalten kann) bis zum nächsten Auftreten von "Von:" erhalten sollte. Im Moment bekomme ich mehr Informationen, aber es reicht nicht: Beispielausgabe Von: somebody1@domain.com An: person@domain.com Datum: Mo, 06. Juli 2015 um 17:41:03 GMT Betreff: *************** Inhaltstyp: ** ******************************* X-Scan-By: ************* ********* und kein Körper danach wtk vor 9 Jahren 0
Suchen Sie nach der Datei, an der der Abschnitt angehalten wird, und _wobably_ finden Sie ein anderes Mal das Schlüsselwort "From: somebody1 @ domain.com" ... Sie müssen einen anderen eindeutigen Schlüssel auswählen, den Sie nicht wieder finden Körper Ihrer Nachricht. Mit der "awk" -Antwort wird es genauso sein. Probieren Sie es auch aus. Hastur vor 9 Jahren 0
0
Hastur

Mit awk:

awk '/From: [Ss]omebody1/ \ /to\: person1/ else } \ /From/ } ' input.txt  
  • /From: [Ss]omebody1/ \ Setzen Sie eine Flag-Variable bei Übereinstimmung auf 1 und überspringen Sie die Zeile.
  • /to\: person1/ Wenn das Flag 1 ist, aktualisieren Sie es auf 2, und setzen Sie es auf 0 zurück.
  • /From/ Bei Übereinstimmung wird der Flag-Wert zurückgesetzt.
  • }Wenn flag 2 ist, werden die Leinenummer und die Zeile gedruckt .

Ändern Sie den Wert von person1, um unterschiedliche Übereinstimmungen zu haben.

Eingabedatei verwendet

From: somebody1@domain.com to: person2@domain.com <body of the message1>  From: somebody2@domain.com to: person1@domain.com <body of the message2>  From: somebody1@domain.com to: person1@domain.com <body of the message3>  From: somebody1@domain.com to: person1@domain.com <body of the message4>  From: somebody3@domain.com to: person@domain.com <body of the message5>