Powered by Invision Power Board


  Reply to this topicStart new topicStart Poll

> [Shell-Skript, mailq] 1. Zeile speichern, wenn ..., ... 2. Zeile "Connection timed out" enthält
ClausVB
geschrieben am: Dienstag, 25.Mai 2004, 09:45 Uhr
Quote Post


*****

Mitglied


Hallo zusammen!

Ich benutzte folgendes Shell-Skript um eine Übersicht über "Mail-Zombies" oder Spam zu bekommen (oder sie zu löschen):

Die "mailq" hat folgende Struktur:

CODE
D90C557DAB     1657 Sun May 23 15:43:10  angela.kohl@domain1.de
             (connect to larrysplace.com[66.31.120.78]: Connection timed out)
                                        gmfvtq@larrysplace.com

DCF5F57DDD     1590 Fri May 21 16:56:23  josef.fischer@domain2.de
  (connect to mx1.sms.turkcell.com.tr[212.252.169.188]: Connection timed out)
                                        5362883562@sms.turkcell.com.tr

DC33657D7E     3315 Tue May 25 09:50:30  gaby.rau@domain3.de
                     (host domain4[194.95.177.102] said: 421 Try later)
                                        Michael.Rahm@domain4.de

DA6D457DE2    41439 Fri May 21 17:00:11  ceo@wichtige-firma.de
(Name service error for dienstleister.de: Host not found, try again)
                                        wichtiger-ansprechpartner@dienstleister.de

ADC6857D7F     6950 Tue May 25 10:08:45  MAILER-DAEMON
                  (connect to 222.47.94.18[222.47.94.18]: Connection refused)
                                        "Alyce534@qwm2151.comKay1501"@asemeds.com

CODE
for i in `mailq | grep MAILER-DAEMON | awk '{print $1}'`
> do
> variable=`basename $i "*"`
> postsuper -d $variable
> done

Ich kann PHP programmieren, aber diese FOR-Schleife habe ich mir geklaut. Trotzdem weiß ich ungefähr, was die Schleife macht:
  • Es werden nur Zeilen mit "MAILER-DAEMON" (grep MAILER-DAEMON) ausgewertet
  • i => D90C557DAB (die ID der Mail)
  • variable => D90C557DAB (ohne * wenn "i == D90C557DAB*")
  • postsuper -d D90C557DAB => löscht die Mail
Mein Problem: Ich möchte alle Mails löschen, die in der 2. Zeile "Connection timed out" stehen haben.

Wie merke ich mir die Mail-ID (D90C557DAB) der vorhergenden Zeile (bzw. der 1. Zeile) und lösche nur dann, wenn die 2. Zeile ein "Connection timed out" enthält?

Danke im Voraus für Eure Hilfe!
Gruß Claus


--------------------
PMUsers WebsiteICQ
Top
me.tom
geschrieben am: Donnerstag, 27.Mai 2004, 00:14 Uhr
Quote Post


****

Mitglied


Hallo Claus.

Sowas in der Art?

CODE
mailq | while read LINE; do
  if echo $LINE | grep -q "^[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]\ "; then
     ID="`echo $LINE | awk '{print $1}'`"
  elif echo $LINE | grep -q 'Connection timed out'; then
     [ ":$ID:" = :: ] || postsuper -d $ID
  fi
done


Die regexp kann man bestimmt schoener machen, aber mir viel grad nicht ein wie, und nachschlagen hatte ich keine Lust... fg.gif

Gruss,

tom.
PMEmail Poster
Top
ClausVB
geschrieben am: Donnerstag, 27.Mai 2004, 11:09 Uhr
Quote Post


*****

Mitglied


Tausend Dank, Tom!

Funktioniert prima.

Ich werde mal versuchen die RegEx zu optimieren und hier dann die abgeänderte Zeile zu posten.

Ich hoffe mal, das die RegEx ähnlich funktionieren wie in PHP.

Gruß
Claus


--------------------
PMUsers WebsiteICQ
Top
me.tom
geschrieben am: Donnerstag, 27.Mai 2004, 12:40 Uhr
Quote Post


****

Mitglied


Hallo Claus,

wenn die mailq laenger ist, sollte man in diesem einfachen Fall statt awk evtl das schnellere cut verwenden: cut -d' ' -f1

Und (gnu) grep kann auch mit -e und -P eine erweiterte- bzw perl-Syntax, wenn man das denn unbedingt will/braucht...

Gruss,

tom.
PMEmail Poster
Top
ClausVB
geschrieben am: Donnerstag, 27.Mai 2004, 14:36 Uhr
Quote Post


*****

Mitglied


Ok, ich habe jetzt verschiedenes ausprobiert und nach ein paar Experimenten ist folgendes für mich sehr effektiv:
CODE
mailq | while read LINE; do if echo $LINE | grep -q "^[A-Z0-9]"; then ID="`echo $LINE | awk '{print $1}'`"; elif echo $LINE | grep -q 'server dropped connection'; then [ ":$ID:" = :: ] || echo $ID; fi; done

Den GREP habe ich auf folgendes reduziert:
grep -q "^[A-Z0-9]";
denn der awk macht dann den Rest. Den
echo $ID;
benutze ich um erstmal auszugeben und nicht zu löschen.

Du hast mir sehr geholfen, Tom! Danke!

Gruß
Claus


--------------------
PMUsers WebsiteICQ
Top
0 Benutzer lesen momentan dieses Thema (0 Gäste and 0 anonyme Benutzer)
0 Mitglieder:

Topic Options Reply to this topicStart new topicStart Poll