sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #76673
Re: grep og regulære udtryk
On Sat, Oct 02, 2004 at 20:45:58 +0200, Kim Hermansen wrote:
> Jeg er vist ved at være lidt træt, eller også er der noget med regulære udtryk
>
> bare ikke fatter ;-)
>
....
>
> grep domæne /var/log/httpd/access_log | grep -v IP 1 | grep -v IP 2 | \
> grep -v IP 3 > kontrol.txt
>
> Dette burde jo kunne skrives noget pænere, men ....
>
> Jeg kunne godt bruge et kraftigt vink med en vognstang til hvordan.
>
> Et par eksempler på hvordan ovenstående kunne se ud som regulært udtryk vill!
Husk at syntaksen for regulære udtryk er lidt speciel
og bla. "." matcher et vilkålig tegn.
Se regex(7), dvs. "man 7 regex".
Du kunne bruge egrep, da grep ikke tillader flere udstryk i en:
grep 'domæne' /var/log/..... | \
egrep -v '123\.123\.123\.123|156\.156\.156\.156|178\.178\.178\.178'
Eller bruge Gnu AWK (gawk) der er velegnet til tekstopgaver:
gawk ' /domæne/ &&
! (/123\.123\.123\.123/
|| /156\.156\.156\.156/
|| /178\.178\.178\.178/ {
print ;
} ' var/log/httpd/access_log
online manualen til gawk beskriver det meste af sproget, derudover
har der på sslug i tidlegere julekalendere været nogle eksempler
på brug af awk.
Vær opmærksom på at ovenstående vil let kunne give "falske" match
da du ikke tager hensyn til i hvilke felter de enkelte matcher.
Så er domæne="hej", så vil alle linier der indeholder "hej" matche
også dem der har det i URL: ../hej/med/dig.html
I AWK kan du checke/matche på enkelte felter, så hvis IP altid
er det første felt:
gawk ' $1 /domæne/ &&
! ( $3 ~ /123\.123\.123\.123/
|| $3 ~ /156\.156\.156\.156/
|| $3 ~ /178\.178\.178\.178/ {
print ;
} ' var/log/httpd/access_log
Her antager jeg så at log filen har udseende så felt 1 er
domænet og felt 3 er IP:
mitdomæne - 123.123.123.123 ....
Felter er som standard i awk sat til blanktegn, men formatet på
en linie (record) kan ændres.
--
mvh Frank Damgaard |
References