PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Fragen zu bash builtins und awk



403
11-04-2007, 22:18
Hallo :)

Ich wollte mal wissen ob
echo '1\n2\n3\n' schneller ist als
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
sed -e s'/.*] //g' einfach das
Datum abzuschneiden. Mich wuerde aber mal eine awk Loesung interessieren. Muesste doch
etwa so aussehen:


awk '^/\[.*\]/ {print}' access_log

Ich frag mich wie man hier '[' behandeln muss. Jemand ne Idee?


Gruss 403

peschmae
11-04-2007, 23:04
1)



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 :D

awk /[[].*[]]/{print}

Hab aber auch noch nicht weiter getestet ;)

MfG Peschmä

403
11-04-2007, 23:12
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 :rolleyes: , aber
das Problem bleibt ja.

403
12-04-2007, 00:40
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.


#!/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. :D

*EDIT2*

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.

jan61
11-05-2007, 21:26
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
sed -e s'/.*] //g' einfach das
Datum abzuschneiden. Mich wuerde aber mal eine awk Loesung interessieren. Muesste doch
etwa so aussehen:


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:

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