Anzeige:
Ergebnis 1 bis 5 von 5

Thema: variable in awk bzw sed bitte um verbesserung

  1. #1
    Gast

    Question variable in awk bzw sed bitte um verbesserung

    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.]

  2. #2
    Gast

    Post

    Ich wuerde an deiner Stelle zwei Skripte machen:

    [check_mail.sh:
    Code:
    #!/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:
    Code:
    #!/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.]

  3. #3
    Gast

    Post

    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.

  4. #4
    Gast

    Post

    Hab meinen alten Beitrag ausgebessert ;-)

  5. #5
    Gast

    Post

    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •