PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : variable in awk bzw sed bitte um verbesserung



03-02-2001, 15:00
Hallo,
da auf meine frage zwecks mail-filterung niemand antwortet
hab ich mich mal dran gemacht,
bitte berücksichtigt das ich ein absoluter Bash-script-Newbie bin
es folgt jetzt das script:

--->>>
cd /var/spool/mqueue # ins verzeichnis mqueue
maxgroesse=2048 #mehr dar er nicht
user=berell # zur zeit leider o. funktion
ls -s d* > wx.0 # dateien df* incl grösse in wx.0 screiben
ls d* > wx.4 # in wx.4 stehen nur die Dateinamen
wc -l wx.0 > wx.1 #anzahl Wörter ermitteln

# erst mal die anzahl der vorhanden dateien ermitteln
# hierzu wird das von wc ermittelte ergebniss um den angehängten datei-namen
# verkürzt es bleibt die zahl :
# und wird glecihzeitig an die variable zahl übergeben
zahl=`sed -e 's/\([0-9]*\)\(wx.*\)/\1/' wx.1`


#mal sehen was mer so haben:
echo "zahl:$zahl"


# so jetzt wisse mer die anzahl der dateien aber
# jetze müsse mer die grösse der dateien ermitteln
# wir schneiden die dateinamen das von ls -l ermittelte ergebniss ab
# und erhalten die grösse als liste und kneule die in wx.3

sed -e 's/\([0-9]*\)\(df.*\)/\1/' wx.0 > wx.3 #filtern nach 1.zahl nicht nach
# nahme
# jetzt müssen wir in einer schleife die größe untersuchen und wenn sie zu
# gross ist müssen wir festellen welche datei zu gross ist
# dann schauen wir nach wer den diese shit-datei verschicken wollte
# und wenn es der richtige user war wird sie halt einfach gelöscht :-))

x=1
#schleife muss so lang laufen wie es dateien gibt
while [ $x -le $zahl ] ; do
# wir brauche immer nur die erste zeile zu untersuchen
groesse=`sed -n -e '1 p' wx.3`

# hier muss die zu große datei festgestellt werden

if [ $groesse -le $maxgroesse ]; then # wenn kleiner oder gleich isses mir
#egal
echo "$groesse ist kleiner bzw gleich als 2MB"
# wenn nicht müssen wir mal schauen !
else

echo "$groesse ist größer als 2MB bitte löschen"
# ermitteln wer der eigner ist
# dazu muss noch die endung getauscht werden df... -> qf...
#erst mal erstes zeichen abschneiden

datei=`sed -n -e '1 p' wx.4|cat $1|cut -c2-`
# dann ein q davor
datei=`expr q$datei`
#mal sehen ob es funzt :
echo "datei=$datei"
# dursuchen nach dem sender
# bei verwendung von outlock od netscape:

# Hier muss der username eingesetzt werden :!!!!!!

wersendet=`awk '/berell/' $datei|cut -c-8`
echo "wersendet :$wersendet"
if [ $wersendet = "berell" ]; then
loesche=1
geloescht=`sed -n -e '1 p' wx.4`

echo "Datei wird gelöscht :$geloescht"
rm $geloescht
fi
fi
echo "löschen ?:$loesche"


tail -n $((`cat wx.3 | wc -l`-1)) wx.3 > tmp.$$; mv tmp.$$ wx.3
tail -n $((`cat wx.4 | wc -l`-1)) wx.4 > tmp.$$; mv tmp.$$ wx.4
x=`expr $x + 1`

done
rm wx.*

<----


das script arbeitet so wie gedacht,
es wird im verzeichnis /var/spool/mqueue nach dateien gesucht die grösser
als x (2048) sind ,danach wird ermittelt wer die datei gesendet hat.
wenn es der bestimmte user ist, wird sie gelöscht.
(funzt natürlich nur wenn die mails in mqueue gespeichert sind und von hand
bzw. später per cron gesendet werden)

es müsste allerdings noch einiges verfeinert werden, was mir über meinen
momentanen horizont wächst : der user müsste oben als variable angegeben
werden und auch die abfrage mit awk funzt,
damit dieser nicht weiter unten von hand eingegeben werden muss .
aber wie ?
desweiteren : wie kann man dann eine mail an den user schicken, das er mal
wieder sein max-space überschritten hat ??

über verbesserungs-vorschläge jeglicher art wär ich sehr interresiert, da ich
noch vieeeeel lernen muß

erst mal danke.
-grüße bernd



[Dieser Beitrag wurde von berell am 03. Februar 2001 editiert.]

03-02-2001, 16:46
Ich wuerde an deiner Stelle zwei Skripte machen:

[check_mail.sh:

#!/bin/bash
#user ist gleich erstes argument
user=$1
# check
if test $user == ""; then
echo "usage: check_mail username"
exit
fi
# suche in /var/spool/mqueue
# ohne unterverzeichnisse
# normale Dateien
# groesser als 2024 KByte
# mit name df* und rufe fuer je
# check_mail_helper.sh dateiname $user
# auf
find /var/spool/mqueue -maxdepth 1 -xtype f -size +2024k -name df\* -exec check_mail_helper.sh \{\} $user \;


check_mail_helper.sh:

#!/bin/bash
#d_datei gleich dem ersten Argument.
d_datei=$1
#user gleich dem zweiten Argument
user=$2
# q_datei = q + datei ab 3. Buchstaben
q_datei=q${d_datei:2}
# finde alle Zeilen mit From an anfang
# nimm nur die erste
# schneide alles vor dem ersten Lehrzeichen weg
# schneide alles ab dem @ weg
# d_user = sendername
d_user=`grep "^From: " $q_datei | head -n 1 | cut -d " " -f 2-` | cut -d "@" -f1

#von besagtem user?
if test $d_user == $user;then
# loesche Datei
# zum testen auskommentiert
# rm $d_datei $q_datei
echo "Loesche: "$d_datei und $q_datei
# mail an betroffenen user
# carbon copy ad admin
MAIL=$d_user@domain.bla.blup
echo "Mailquota ueberschritten" | mail -s "Mailquota" -c adim@domain.bla.blup $MAIL
else
#anderer user
echo ">2M-Datei gehoert "$d_user"; Keine Aktion"
fi


Noch mal zur erklaerung:

Du startest mit (nach chmod u+x check*.sh)
$ checkmail bellert
Daraufhin sucht find passende Dateien und ruft fuer _jede_ einzeln
check_mail_helper dateiname bellert
auf.

check_mail_helper sucht den Benutzernamen,
vergeleicht und bei Uebereinstimmung wirden beide Dateien geloescht und eine Mail an den user mit Kopie an den Admin geschickt.
(Vielleicht sollte man erst loeschen, wenn die Mail erfolgreich geschickt wurde)
Bei einem anderen Benutzer gibts eine Warnmeldung.

Die Schleife steckt also im find.
Deine while Konstruktion mit dem Zeilenweisen Dateilesen ist fuer Shellskripte weniger geeignet. Vielleicht solltes Du dir mal Python oder Perl anschauen. Damit geht sowas leichter.

bye


[Dieser Beitrag wurde von jgbauman am 03. Februar 2001 editiert.]

03-02-2001, 22:19
Hallo,
danke erst ma für die schnelle antwort
ich hab oben das noch mal editiert war ein fehler nach #Hier muss der User-Name.. drin
.
die abfrage mit find ,find ich net schlecht aber was iss wenn es mehr dateien sind ?? die größer als 2 MB sind ?

hier noch mal die erklärung
1.es werden alle dateien aus /var/spool/mqueue die mit df. anfangen in eine temporäre datei geschrieben
damit zähle ich die anzahl der df..-dateien sowie speicher die namen um danach !alle! zu untersuchen
das werde ich mit deinem find so abändern das nur noch die zu großen dateien gelistet werden :-)
und dann nur noch diese untersucht werden
dann habe ich :
1. Anzahl der zu großen Dateien
2. Die Dateinamen
jetzt muss ich feststellen wer diese datei
gesendet hat
hierzu muss der anfangsbuchstabe der gefundenen df.. dateien
von df* auf qf* geändert werden
dann wird diese nach dem sender From:user
dursucht
wenn diese mit user übereinstimmt wird die datei gelöscht
sowie eine mail an user gesendet
danach gehts mit der nächsten weiter.
jo das wars .
noch fragen ??
-grüße- bernd
p.s die schleife :
while..
in wx.3 steht in jeder zeile eine zu große datei
ich muss die erste zeile untersuchen :
groesse=`sed -n -e '1 p' wx.3`
wird untersucht und wenn zu gr0ß und
von dem user wird die df..-datei gelöscht
und zum schluß die 1.zeile entfernt dann
gehts wieder von vorne los bis alle durch sind.

03-02-2001, 22:45
Hab meinen alten Beitrag ausgebessert ;-)

04-02-2001, 11:05
Hallo jgbaumann,
du bist ein wahrer Held
das war genau was mir fehlte !
man kann an deinem script hier viel lernen.

hat trotzdem nicht ganz funktioniert folgendes hab ich an check_mail geändert :
1.
die übergebene datei hatte noch den pfad vorne dran
ich wechsel also direkt ins /var/spool/mqueue verzeichnis (im Moment :/mailtest)
2.
da als root gestartet hab ich den befehl -exec leicht abgeändert :
./check_mail_helper.sh


Datei:check_mail.sh :
---->>>>
#!/bin/bash
cd /mailtest
#user ist gleich erstes argument
user=$1
# check
if test $user == ""; then
echo "usage: check_mail username"
exit
fi
# suche in /mailtest
# ohne unterverzeichnisse
# normale Dateien
# groesser als 2024 KByte
# mit name df* und rufe fuer je
# check_mail_helper.sh dateiname $user
# auf
find -maxdepth 1 -xtype f -size +2024k -name df\* -exec ./check_mail_helper.sh \{\} $user \;
----<<<<<


auch check_mail_helper.sh hat ein paar änderungen erhalten:
1.
q_datei war immer falsch
hab dann in q_datei=gf${d_datei:4} geändert

4.
er hat nie den user gefunden weil es nicht in der ersten zeile steht
sondern irgendwo zwichen 12 + 20.zeile
desweitern findet er dort den Full-Name und dann die email
die email als <user> oder bei kmail als <user@domain>
so dass das abschneiden anders erfolgt
5.
die d_datei war auch bissche falsch hat immer ein ./vorn dran
wird halt abgescnitte

Datei check_mail_helper_sh
----->>>>
#!/bin/bash
#d_datei gleich dem ersten Argument.
d_datei=$1
#user gleich dem zweiten Argument
user=$2
# q_datei = q + datei ab 3. Buchstaben
q_datei=qf${d_datei:4}
# finde alle Zeilen mit From an anfang
# nimm nur die erste
# schneide alles vor dem ersten Lehrzeichen weg
# schneide alles ab dem @ weg
# d_user = sendername

d_user=`grep "H??From" $q_datei | cut -d "<" -f 2- | cut -d ">" -f1 |cut -d "@" -f1 `

#von besagtem user?
if test $d_user == $user;then

# loesche Datei
# zum testen auskommentiert
d_datei=d${d_datei:3}
#rm $d_datei $q_datei
echo "Loesche: "$d_datei und $q_datei
# mail an betroffenen user
# carbon copy ad admin
MAIL=$d_user
echo "Mailquota ueberschritten" | mail -s "Mailquota" -c root $MAIL
else
#anderer user
echo ">2M-Datei gehoert "$d_user"; Keine Aktion"
fi

------<<<<<<<

Das wars läuft einwandfrei ! :-)
sendmail -q wird in mail_check.sh zum schluß ausgeführt
alles wird dann per cron gestartet + ip-up

werde noch die Datei die versendet werden sollte aus qf rausfiltern um es dem user mitzuteilen
welche es war :-)


Nochmals Danke !

-grüße- bernd