Zeilenwerkzeuge und mbox-Dateien

02/04/2016 - 04:42 von ram | Report spam
Diese Frage beschàftigt mich nun schon seit Jahren. Ich habe
unter GNU einige gute Werkzeuge für zeilenbasierte Dateien
wie zum Beispiel »grep«.

»grep xyzzy« zeigt mir alle Zeilen an, die »xyzzy« enthalten.

Nun habe ich aber eine mbox-Datei.

From example@example.com Sat Jan 3 01:05:34 1996
Delivered-To: djb@silverton.berkeley.edu
Date: 3 Jan 1996 01:05:34 -0000
From: <example@example.com>
To: djb@silverton.berkeley.edu (D. J. Bernstein)

How's that mail system project coming along?

Diese mbox-Datei ist auch eine Textdatei, aber sie besteht
aus /Abschnitten/ (messages), die mit »From « beginnen.
Jetzt würde ich gerne mit »grep xyzzy« als /Abschnitte/
(messages) (nicht /Zeilen/!) erhalten, die »xyzzy« enthalten.

Nun ich habe schon eine Idee, wie ich dies erreichen könnte:

1.) Ich ersetze alle »\« durch »\\«·
2.) Ich ersetze alle Zeilenenden durch »«.
(Zur Vereinfachung für dieses Posting nehme ich
an, daß jetzt kein »\« in der Datei vorkommt.)
3.) Ich ersetze alle »From « durch ein Zeilenende

Nun habe ich jeden mbox-Abschnitt (also jede /message/) in eine
Zeile verwandelt! (Diese Zeilen könnten jetzt sehr lang sein,
aber ich nehme einmal an, daß moderne GNU-Werkzeuge damit
klar kommen.)

Jetzt kann ich grep anwenden (und andere Zeilenwerkzeuge).

Zum Schluß kann ich dann die drei Schritte wieder rückgàngig
machen, um wieder Abschnitte statt Zeilen zu sehen.

Allgemein habe ich also den Wunsch die Zeilenwerkzeuge auch
auf Textdateien mit »Abschnitten« anzuwenden, wobei ein
Abschnitt einer Zeile entsprechen soll, aber mehrere Zeilen
umfassen kann. Die Abschnitte könnten beispielsweise durch
eine regular expression für den Abschnittstrenner definiert
sein. Diese Problem hatte ich schon öfter, nicht nur mit
mbox-Dateien.

Ich habe ja skizziert, wie ich so etwas implementieren
könnte, aber es wàre natürlich schöner, wenn es so etwas
schon geben würde.

Kennt also jemand entweder »Abschnittswerkzeuge«, die den
bekannten Zeilenwerkzeugen entsprechen, oder vielleicht
Werkzeuge oder eine API für mbox-Dateien, mit denen man
leicht beispielsweise folgende Aufgaben erledigen kann:

- eine Sammlung von mbox-Dateien soll in eine einzige
mbox-Datei konsolidiert werden, so daß jede Message-ID
nur einmal in der Ausgabe vorkommt (wenn es sein könnte,
daß ein und dieselbe Nachricht mehrfach in verschiedenen
mbox-Dateien enthalten ist),

- Alle Messages aus einer mbox-Datei, die eine
Entsprechung für einen bestimmten regulàrem Ausdruck
enthalten, sollen in eine andere mbox-Datei kopiert werden,

- eine mbox-Datei soll nach einem Felde (wie »Date:«
oder »From:«) sortiert werden.

?
 

Lesen sie die antworten

#1 Juergen P. Meier
02/04/2016 - 06:58 | Warnen spam
Stefan Ram :
Diese Frage beschàftigt mich nun schon seit Jahren. Ich habe
unter GNU einige gute Werkzeuge für zeilenbasierte Dateien
wie zum Beispiel »grep«.

»grep xyzzy« zeigt mir alle Zeilen an, die »xyzzy« enthalten.

Nun habe ich aber eine mbox-Datei.



mbox Dateiformat ist im Grunde einfach aber doof zu parsen.

Ein neuer Record beginnt immer mit so einer Zeile:

From Sat Jan 3 01:05:34 1996



Nach einer Leerzeile.
Intelligenere PArser verstehen auch MIME-Encoding und Message-Length
Headerelemente, damit eine e-Mail mit so einer Zeile mitten im Text
nicht als Beginn einer neuen Mail fehlinterpretiert wird.

Nun ich habe schon eine Idee, wie ich dies erreichen könnte:

1.) Ich ersetze alle »\« durch »\\«·
2.) Ich ersetze alle Zeilenenden durch »«.
(Zur Vereinfachung für dieses Posting nehme ich
an, daß jetzt kein »\« in der Datei vorkommt.)
3.) Ich ersetze alle »From « durch ein Zeilenende



Oder du nimmst awk dafuer. Das ist nebem dem Universalwerkzeug Perl
dafuer am besten geeignet.

Oder aber du nimmst formail, das ist ein spezialisierter PArser fuer
mbox-Files, der pro e-Mail aktionen bzw. Scripte mit dem Mailtext
ausfuehren kann.

Nun habe ich jeden mbox-Abschnitt (also jede /message/) in eine
Zeile verwandelt! (Diese Zeilen könnten jetzt sehr lang sein,
aber ich nehme einmal an, daß moderne GNU-Werkzeuge damit
klar kommen.)



Es gibt fuer alles Limits. Auch fuer die Puffer von grep (egal welche
Toolchest). Die sollten aber gross genug sein.

Ich habe ja skizziert, wie ich so etwas implementieren
könnte, aber es wàre natürlich schöner, wenn es so etwas
schon geben würde.



Wenn es dir nur darum geht, die (komplette) Mail auszugeben, in der
irgendwo ein bestimmter Suchbegriff zu finden ist, kannst du dafuer
den Mailclient mutt verwenden.
Allerdings nicht gescripted sondern nur Interaktiv.

Kennt also jemand entweder »Abschnittswerkzeuge«, die den
bekannten Zeilenwerkzeugen entsprechen, oder vielleicht



awk kann das. Es arbeitet Recordweise, man muss diesen nur passend
definieren.

Werkzeuge oder eine API für mbox-Dateien, mit denen man
leicht beispielsweise folgende Aufgaben erledigen kann:

- eine Sammlung von mbox-Dateien soll in eine einzige
mbox-Datei konsolidiert werden, so daß jede Message-ID
nur einmal in der Ausgabe vorkommt (wenn es sein könnte,
daß ein und dieselbe Nachricht mehrfach in verschiedenen
mbox-Dateien enthalten ist),

- Alle Messages aus einer mbox-Datei, die eine
Entsprechung für einen bestimmten regulàrem Ausdruck
enthalten, sollen in eine andere mbox-Datei kopiert werden,

- eine mbox-Datei soll nach einem Felde (wie »Date:«
oder »From:«) sortiert werden.



Aber eigentlich suchst du das Tool mboxgrep.
http://www.mboxgrep.org/
apt-get install mboxgrep
yum install mboxgrep
emerge mboxgrep
etc.

Juergen
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen