Grep to csv

Sziasztok!

Adott maildir könyvtárból kellene kigreppelnem
a date, sender, subjectet és a végeredmény valami táblázatba rakni.

eddig jutottam.

cat *|grep -E '^(From|Date|Subject)'>valami.txt

Date: Tue, 18 Jan 2011 11:29:36 +0100
From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]
Subject: valami1

Date: Tue, 18 Jan 2011 11:29:36 +0100
From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]
Subject: valami2

Date: Tue, 18 Jan 2011 11:29:36 +0100
From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]
Subject: valami3

Viszont valami ilyesmi kellene

Date From, Subject
Tue, 18 Jan 2011 11:29:36 +0100 XYZ ZZZ [mailto:maci.laci@aa-bb.com] valami1
Tue, 18 Jan 2011 11:29:36 +0100 XYZ ZZZ [mailto:maci.laci@aa-bb.com] valami2

köszönöm előre is a hintet

szép napot

Hozzászólások

Hm. Nem látom, hogy mi a francért van a te példádban minden harmadik sor után egy üres sor. Ha feltesszük, hogy csak simán olvashatóvá akartad varázsolni, akkor:

a grep után kivágod a szemétbe minden sorból az első szóköz/tabulátorig terjedő dolgokat (erre jó a cut), majd pedig az így kapott (már csak számodra értékes) adatokat tartalmazó sorokból hármat egymás mellé ragasztasz a paste nevű paranccsal.

Hintet kértél, tehát RTFM cut(1) és paste(1).

Azért ha még fontos a dolog, nem bánnám, ha kopiznád a "szétcsúszásig" a be- és a kimenetet - ui. nem értem, hogy mi és hogyan csúszhat szét.

Addig is még 2 sedes variáció a fenti témára, csak azért, mert ritkán és igen primitíven használok sedet, és most picit pótoltam a hiányt:


sed \
   -e '/^Date: / {s@^Date: @@; h}' \
   -e '/^From: / {s@^From: @@; H}' \
   -e '/^Subject: / {s@^Subject: @@; H; g; s@\n@,@g; p}' \
   -e 'd' \
   *.logs

sed \
   -e 's@^Date: @@; t date' \
   -e 's@^From: @@; t from' \
   -e 's@^Subject: @@; t subject' \
   -e 'd' \
   -e ':date h; d' \
   -e ':from H; d' \
   -e ':subject H; g; s@\n@,@g; p; d' \
   *.logs

Én arra tippelek, hogy az egyik fájl valahogy másmilyen formátumú fejlécekkel rendelkezik, vagy esetleg magában a szövegnben is lehetnek a keresett szövegek. Eleve minden megoldás hibás, lévén csak a fejlécekben szabadna keresni, szóval kb "cat * | sed -n -e '1,/^$/p' | ...." formában kéne kezdeni. (Itt még a cat * is fölösleges, a grep-nél azért nem nyafogtam, mert nem vagyok benne biztos, hogy standard a grep -h opciója.)

A sed-es példáidhoz:

a) Erősen kihasználod, hogy Date/From/Subject sorrendben vannak a fejlécek, holott direkt belenéztem most egy levélbe, és ez nem feltétlenül igaz. (Szerintem ez a szabványban sincs benne.)

b) nincs semmi bajom a @-jellel, de miért nem a sokkal elterjedtebben ismert /-t használtad?

c) én inkább adnék a sed-nek egy -n opciót, és nem strapálnám magam a sortörlésekkel

d) azért parancssorból sed-ben cimkéket definiálni/használni, kemény perverzió.

a) Egyszerűen elhittem a példa alapján, hogy ezeket keressük.

b) Jellemzően a /-t használom, itt láttatni szerettem volna, hogy így is, úgy is lehet, illetve az egyszerre címző és cserélő példában azt, hogy mi hol kezdődik.
Különben nem is mondok teljesen igazat, mert nagyszámú csere esetén @-ra áll a kezem - jó sok éve, amikor az első m4/sed által feldolgozott konfigtemplétekbe pillantottam, a temp ill. szkript kukacosan tűnt olvashatóbbnak.

c) Hogy milyen igaz... Itt látszik, hogy 1: tényleg csak -e 's/x/y/g'-re szoktam használni, és 2: hiába futottam át ma a mant, ha túl gyorsan futottam, és a legelső(!) opciót átgörgettem.

d) Ki akartam ezt is próbálni, ha már a manban belegabalyodtam. :) ld. c)

Sajnos a gond a sorrendiséggel van A Mime ugyanis ezt nem írja elő.

Még arra gondoltam, hogy ha egy scrip megvizsgálná, hogy a file melyik típussal kezdődik (date, subject vagy from) és aszerint 3 csoportba sorolja őket. így keletkezne 3 jó csv...

Persze sajna ehhez sem értek :-(.

Javasolták nekem megoldásként a pearl mime értelmezőjét, de akkor be kell olvasni a teljes file-t.....

szép napot

G

Az én hintem az, hogy én perl-t vagy python-t használnék... Jön ugyanis majd olyan levél, aminek nem ASCII a subject sora, és akkor majd jön az a kérés is rögtön, hogy nem-e-lehetne-e a mindenféle elcsettintett encodingokat dekódolni, hogy olvasható is legyen a subject.

gagyi, de csv jellegu lesz:


# cat * | grep -E '^(From|Date|Subject)' | sed -e 'N;N;s/\n/; /g'

Date: Tue, 18 Jan 2011 11:29:36 +0100; From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]; Subject: valami1
Date: Tue, 18 Jan 2011 11:29:36 +0100; From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]; Subject: valami2
Date: Tue, 18 Jan 2011 11:29:36 +0100; From: XYZ ZZZ [mailto:maci.laci@aa-bb.com]; Subject: valami3

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Amit a fentiek és lentiek alapján valószínűleg legkönnyebben értelmezhetsz, ha olyanod támad:


awk -vSEP="," 'sub(/^(Date|From): /,"") { printf "\"%s\"%s", $0, SEP; next}; sub(/^Subject: /, "") { printf "\"%s\"\n", $0; }' *.log

A SEP lesz a mezőhatároló, esetemben vessző, hogy a comma comma legyen.