Anzeige:
Ergebnis 1 bis 5 von 5

Thema: 2 Fragen zu bash builtins und awk

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.05.2001
    Beiträge
    88

    2 Fragen zu bash builtins und awk

    Hallo

    Ich wollte mal wissen ob
    Code:
    echo '1\n2\n3\n'
    schneller ist als
    Code:
    for z in 1 2 3; do echo $z; done
    Nun sind beides bash builtins und time gibt nichts her, kann man die Unterschiede dennoch
    messen?

    Die andere Sache, aergert mich Und zwar, soll das Datum aus dem access_log herausfliegen,
    da ich eine Liste unerwuenschter Methoden (HEAD, TRACE) zusammenstellen will um die IP
    Adressen zu ermitteln. Das klappt bereits, allerdings werden aufgrund des Datum die Treffer
    nicht mit uniq aussortiert. Meine Loesung war jetzt mit
    Code:
    sed -e s'/.*] //g'
    einfach das
    Datum abzuschneiden. Mich wuerde aber mal eine awk Loesung interessieren. Muesste doch
    etwa so aussehen:

    Code:
    awk  '^/\[.*\]/  {print}'  access_log
    Ich frag mich wie man hier '[' behandeln muss. Jemand ne Idee?


    Gruss 403
    ;)

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    1)

    Code:
    peschmae@sid:~$ time bash -c "echo '1\n2\n3\n'"
    1\n2\n3\n
    
    real    0m0.005s
    user    0m0.000s
    sys     0m0.004s
    peschmae@sid:~$ time bash -c " for z in 1 2 3; do echo $z; done"
    3
    3
    3
    
    real    0m0.005s
    user    0m0.000s
    sys     0m0.004s
    peschmae@sid:~$
    Ist aber nicht immer dasselbe (ist ja logisch, kommt auch auf die anderen Prozesse drauf an )

    Viel Spass damit! (Grundsätzlich ist die for-Schleife natürlich langsamer, aber beim bis 3 zählen fällt dir das glaub ich wirklich nicht auf.)

    2. Weiss ich auch gerade nicht. \\[ geht auch nicht, wobei das hier könnte ja gehen
    Code:
     awk /[[].*[]]/{print}
    Hab aber auch noch nicht weiter getestet

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.05.2001
    Beiträge
    88
    He, Danke fuer die schnelle Antwort, bei mir kam mit time immer 0 auch auf sehr langsamen
    Rechnern. Eigentlich wollte ich mit mehr Daten mal einen richtig langen Benchmark machen.

    Meine sed Loesung fuer das andere Problem funktioniert uebrigens auch nur wenn die IP-Adressen
    nicht am Anfang stehen, hab da die ganze Zeit mit einem falschen Pattern gearbeitet , aber
    das Problem bleibt ja.
    ;)

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.05.2001
    Beiträge
    88
    so, ich weiss nicht ob das schon optimiert ist , wohl 10/100%
    Folgendes "Scriptchen" findet Methoden ungleich GET/POST, und
    sortiert mit $1 = ip die IPs der Clients. Damit laesst sich dann z.B.
    iptables fuettern.

    Code:
     #!/usr/bin/env bash
    
    cd /var/log/httpd || exit 
    
      for LOGFILE in access_log ssl_request_log; do
            # test -f $LOGFILE
    
             echo
             echo "unwanted Methods in $LOGFILE:"
             echo "-----------" 
             METHODS="HEAD|CONNECT|OPTIONS|TRACE"
             DENY='tag='  # omit cvsweb HEAD false positive
    
           for M in $METHODS; do
                if [ "$1" = 'ip' ]; then
                   egrep "$M" $LOGFILE|grep -v ${DENY}|uniq -u| sed 's/\[.*\]/ /g'|awk '{print $1}'|uniq -u
                else 
               egrep "$M" $LOGFILE|grep -v ${DENY}|uniq -u| sed 's/\[.*\]/ /g'
               fi
         done
      done
    Jetzt fehlt nur noch eine Einzeiler Loesung fuer awk.

    *EDIT2*
    Code:
     sed  -ne 's/\[.*\]/ /g;/"CONNECT/p;/"TRACE/p;/"OPTIONS/p;/"HEAD/p'  /var/log/httpd/access_log
    dabei ^^ sollen die Methods in eine Variable, allerdings habe ich das mit sed wieder nicht hinbekommen, da " mit Teil
    des Patterns ist um falsch Positive auszuschliessen.
    Geändert von 403 (12-04-2007 um 17:59 Uhr) Grund: ein sed Befehl klappt, aber noch Ressourcen Verschwendung, da erst das Datum abgezwackt wird
    ;)

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von 403 Beitrag anzeigen
    Die andere Sache, aergert mich Und zwar, soll das Datum aus dem access_log herausfliegen,
    da ich eine Liste unerwuenschter Methoden (HEAD, TRACE) zusammenstellen will um die IP
    Adressen zu ermitteln. Das klappt bereits, allerdings werden aufgrund des Datum die Treffer
    nicht mit uniq aussortiert. Meine Loesung war jetzt mit
    Code:
    sed -e s'/.*] //g'
    einfach das
    Datum abzuschneiden. Mich wuerde aber mal eine awk Loesung interessieren. Muesste doch
    etwa so aussehen:

    Code:
    awk  '^/\[.*\]/  {print}'  access_log
    Ich frag mich wie man hier '[' behandeln muss. Jemand ne Idee?


    Gruss 403
    Wie dieses awk-Beispiel laufen soll, ist mir schleierhaft. Aber weil Du eine 1-Zeilen-Lösung suchst: vielleicht ist es das, was Du willst:
    Code:
    awk ' /tag=/ { getline} /"HEAD|CONNECT|OPTIONS|TRACE"/ { print $1 } ' access_log | sort -u
    Der Witz dabei ist, dass Dich das Datum dabei gar nicht interessieren muss - awk gibt ja nur Feld 1 (die IP) aus. Du kannst jetzt natürlich auch noch in awk sortieren, in dem Du die IPs in ein Array füllst und zum Schluss mit asort sortierst (im END-Abschnitt), aber da ist IMHO der extra sort schneller - und außerdem wäre das in awk ein ganz schön langer Einzeiler .

    Jan

Lesezeichen

Berechtigungen

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