mit awk per string erkennung filtern ?

bofh

Sysop From Hell
hi leute

ich möchte mit awk aus einer einzelnen zeile nur die strings rausschneiden
die auf einen bestimmten vergleich passen.

beispiel :

orginal : "test1@richtig.org test2@richtig.org test3@falsch.org"

rauskommen soll : "test1@richtig.org test2@richtig.org"

siehe ich möchte alle "@richtig.org" rausfiltern

währe nett wenn mir da jemand helfen könnte
 
Servus,

Also mit
Code:
more [I]dateiname[/I] | awk -F " " '{print $1}'
kannst Du ne einzelne Adresse aus der Zeile rausfiltern.
Mit
Code:
awk -F @ '{print $2}'
bekommst dann die Domain.

Also insgesamt:
Code:
more [I]dateiname[/I] | awk -F " " '{print $1}' | awk -F @ '{print $2}'

Geht wahrscheinlich auch einfacher, aber wüsste grad net wie :)
Anschliessend nur noch ne if-Abfrage mit richtig.org und es müsste funktionieren.
 
hi mephisto

wie man einzelne strings cutet weiss ich, nur er soll halt die strings rausfiltern die
das erkennungsmerkmal "@richtig.org" enthalten, dabei aber nicht den string verändern.

um genauzusein ich will aus nem email header der "To" zeile alle empfänger der domain richtig.org filtern.

mit sed habe ich schonmal alle sachen rausgefiltert die nicht zu einer email
adresse gehören und habe dann diese zeichen kette übrig die ich dann nochmal
filtern will.

"test1@richtig.org test2@richtig.org test3@falsch.org"

und wenns geht das mit einem kurzen awk kommando ,)
 
Ach so...

Das könnte hiermit klappen:

Code:
awk '{for(zahl=1;zahl<=[I]Anzahl der Einträge in der 
Datei[/I];zahl++) if($zahl ~ /richtig.org/){print $zahl}}' [I]dateiname[/I]
 
hey das is gut ;)
danke dir :)

eine sache aber noch, da ja die strings dynamisch in der anzahl sind muss das
auch so angepasst werden in dem awk syntax.

sollte eigentlich kein problem sein dachte ich mir.

weil

Code:
echo "test1@richtig.org test2@richtig.org test3@falsch.org" | awk '{for(zahl=1;zahl<=3;zahl++) if($zahl ~ /richtig.org/){print $zahl}}'
test1@richtig.org
test2@richtig.org

funktinoniert auch wunderbar

...

aber


Code:
echo "test1@richtig.org test2@richtig.org test3@falsch.org" | awk -v count=3 '{for(zahl=1;zahl<=$count;zahl++) if($zahl ~ /g/){print $zahl}}'
test1@richtig.org
test2@richtig.org
awk: out of space in makefields 1246055
 input record number 1, file
 source line number 1
bringt dieses, ich finde auch leider per google nichts zu dieser meldung.

und die 3 in der count var muss ich noch irgendwie ersetzten durch "`muss ich
noch überlegen`". is aber denk ich mal nicht das problem.

es währe nett wenn du mir noch zu der fehlermeldung was sagen könntest falls dir
sowas mal über den bildschrimg gelaufen is.
 
Zuletzt bearbeitet:
Hab grad noch mal geschaut (ich wußte doch da gab`s was... )
Um das ganze dynamisch zu halten, nimmst dann NF:

Code:
awk '{for(zahl=1;zahl<=[B]NF[/B];zahl++) if($zahl ~ /richtig.org/){print $zahl}}' dateiname

Zu der Fehlermeldung kann ich Dir allerdings nix sagen,
von der wurde ich bisher verschont :)
 
bofh schrieb:
um genauzusein ich will aus nem email header der "To" zeile alle empfänger der domain richtig.org filtern.

Achso. Wenn's nicht unbedingt awk(1) sein muss, sind formail(1), tr(1) und grep(1) Deine Freunde:

Code:
formail -c -x To < the-mail | tr , \\n | grep whatever-you-want

formail(1) gibt's in jedem gut sortierten procmail-Package.
 
@mephisto : merci, kannst awk scheinbar echt gut :)

@kili : super tip, mit formail kann man ja genau das relativ einfach machen was ich wollte :)

super jungs!
 
bofh schrieb:
@mephisto : merci, kannst awk scheinbar echt gut :)

@kili : super tip, mit formail kann man ja genau das relativ einfach machen was ich wollte :)

Moment, so einfach wollen wir uns das ja nun auch nicht machen. Nur weil Dein Problem geloest ist, heisst das noch lange nicht, dass dieser Thread beendet werden muss.

Also als kleine Uebungsaufgabe: do this wihtout using formail(1) and awk(1).

Im Moment bin ich etwas unkreativ, aber mir schwebt uebles Shell-Geraffel mit IFS-Ferkeleien vor :-)
 
Euch ist klar, dass der Header-Eintrag mehrere Zeilen umfassen kann? formail(1) ist wohl die einzig brauchbare Loesung.

Wer trotzdem awk(1) verwenden will, sollte vielleicht folgendes sed(1) Skript vorschalten.

Code:
1,/^$/ {
  # Join continuation lines:
  /^[   ]/ {
    x
    G
    s/\n[       ]*/ /
    h
    b
  }
  # This is a non-continuation line.
  # Hold it and output previous line
  # (except line 1, when nothing's held):
  x
  #1!p
  /^To/p
}
 
@ killi : da hast du verdammt nochmal recht! :)

mit nem bissel simple shellcoding sollte es so gehen

Code:
DOMAIN="richtig.org"
emailaddys="test1@richtig.org test2@richtig.org test3@falsch.org"
for oneaddy in $emailaddys
do
tmpvar=`echo "$oneaddy" | grep "$DOMAIN"`
 [ "$tmpvar" != "" ] && usefulladdys=`echo "$usefulladdys $oneaddy"`
done
ich höre jetzt schon die kritiker ;)

aber habe mich mit dem eigentlichen problem was ich ja noch umsetzten muss bissel
beschäftigt und doch zu formail gegriffen, weil .....

habe mal ein bissel googled und etwas gefunden als vorlage was genau auf mein
scenario passt, weil ich mit dem prinzip arbeiten muss sammel pop3 konto extern
und ms exchange server intern

http://home.arcor-online.de/v.steltenkamp/linux/pollmail.htm <- der hat eine
nette vorlage dort gemacht, bloss etwas buggy bzw nicht wirklich tauglich für den
finalen endbetrieb.

als vorlage diente dort für die .procmailrc

Code:
TO=`formail -x "To:" | sed -e "s/^.*<//" | sed -e "s/>.*$//"`
:0
*$^To:.*${TO}
!${TO}

das problem dabei war das der sendmail auch an die email adressen versuchte zu
senden die nicht intern waren und alles aus "To" ausser acht gelassen wurde, siehe z.b. "Cc".


habe das mal ergänzt zu

Code:
DOMAIN="richtig.org"
TO=`/usr/local/bin/formail -x "To:" | sed -e "s/^.*<//" | sed -e "s/>.*$//" | grep "$DOMAIN"`
CC=`/usr/local/bin/formail -x "Cc:" | sed -e "s/^.*<//" | sed -e "s/>.*$//" | grep "$DOMAIN"`

:0
*$^To:.*${TO}
*$^Cc:.*${CC}
{
        :0 c
        !${TO}

        :0
        !${CC}
}

:0
*$^To:.*${TO}
!${TO}

habe damit edliche test gemacht und es scheint recht gut zu laufen, bloss habe ich
das "Bcc" problem noch, der externe email server scheint das Bcc rauszuschneiden
was ja auch der sinn der sache is.
 
Zuletzt bearbeitet:
Ich verstehe noch nicht, was das Gewurstel mit sed(1) soll, wenn man doch nur einen String 'greppen' will. Ich moechte euch mal grep(1) ans Herz legen :)

zB
Code:
% echo abc@test.org bblubb@test.org ccc@foo.org depp@test.org easf@blah.net | egrep -o '[^,        ]+@test.org'
abc@test.org
bblubb@test.org
depp@test.org
 
Zurück
Oben