Portál AbcLinuxu, 29. prosince 2025 19:31
SOURCE="/var/www/www-block/events.txt"
ciladresy=`cat /var/www-ssl/admin/access.log`
for x in `grep -v ^# $SOURCE | awk '{print $1"|"$2"|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10"|"$11"|"$12"|"$13"|"$14"|"$15"|"$16"|"$17"|"$18"|"$19}'`; do
x=`echo $x | sed 's/|/ /g'`
x1=`echo $x | awk '{ print $1 }'`
x2=`echo $x | awk '{ print $2 }'`
x3=`echo $x | awk '{ print $3 }'`
x4=`echo $x | awk '{ print $4 }'`
x5=`echo $x | awk '{ print $5 }'`
x6=`echo $x | awk '{ print $6 }'`
x7=`echo $x | awk '{ print $7 }'`
x8=`echo $x | awk '{ print $8 }'`
x9=`echo $x | awk '{ print $9 }'`
x10=`echo $x | awk '{ print $10 }'`
x11=`echo $x | awk '{ print $11 }'`
x12=`echo $x | awk '{ print $12 }'`
x13=`echo $x | awk '{ print $13 }'`
x14=`echo $x | awk '{ print $14 }'`
x15=`echo $x | awk '{ print $15 }'`
x16=`echo $x | awk '{ print $16 }'`
x17=`echo $x | awk '{ print $17 }'`
x18=`echo $x | awk '{ print $18 }'`
x19=`echo $x | awk '{ print $19 }'`
ciladresykk=`echo "$ciladresy" | grep "$x1 $x2 $x3" | awk '{ print $4 }'`
echo "$x1 $x2 $x3 $x4 $x5 $x6 $x7 $x8 $x9 $x10 $x11 $x12 $x13 $x14 $x15 $x16 $x17 $x18 $x19 $ciladresykk" >> /var/www-ssl/admin/squid/squidblok.html
done
vzor /var/www-ssl/admin/access.log
02/02/2007 11:55:37 192.168.1.180 http://www.sonnerie.net/js/xiti.js 02/02/2007 11:55:38 192.168.1.180 http://logi6.xiti.com/hit.xiti?vzor /var/www/www-block/events.txt
02/02/2007 11:42:16 192.168.1.180 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 02/02/2007 11:55:38 192.168.1.180 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)Celé řešení slouží k vypsání zablokovaných spojení a pomocí druhého logu se k těmto spojením hledají cílové adresy. Určitě by to šlo nějak urychlit. Nějaký nápad?
grep -v '^#' $SOURCE \
| while read ln
do
arr=($ln)
echo -n $ln
grep "${arr[0]} ${arr[1]} ${arr[2]}" "$ciladresy" | awk '{ print $4 }'
done >> /var/www-ssl/admin/squid/squidblok.html
ps: nezkoušel jsem to.
#!/usr/bin/env python
def splitter(filename):
for line in file(filename):
line = line.strip()
if not line: continue
splitted = line.split(None, 3)
yield tuple(splitted[:3]), splitted[3]
access = {}
access_splitter = splitter('access.log')
for k, v in access_splitter:
access[k] = v
events_splitter = splitter('events.txt')
for k, v in events_splitter:
try:
url = access[k]
except KeyError:
url = ''
print ' '.join(k), v, url
Dává to stejné výsledky jako ten skript v shellu,
02/02/2007 11:42:16 192.168.1.180 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) 02/02/2007 11:55:38 192.168.1.180 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) http://logi6.xiti.com/hit.xiti?tak je to doufám správně. Testoval jsem zpracování dvou logů, z nichž každý měl 100000 položek. Za tři sekundy to bylo hotovo.
Ale to je teď jedno. Zkrátka když budu mít events.txt s tímto obsahem
02/02/2007 11:42:16 192.168.1.180 prohlizec1 02/02/2007 11:55:38 192.168.1.180 prohlizec2a access.log s tímto
02/02/2007 11:55:37 192.168.1.180 url1 02/02/2007 11:55:38 192.168.1.180 url2 02/02/2007 11:55:38 192.168.1.180 url3Tak má být výsledek tohle?
02/02/2007 11:42:16 192.168.1.180 prohlizec1 02/02/2007 11:55:38 192.168.1.180 prohlizec2 url2 url3Pokud ano, tak to lze vyřešit třeba takto:
#!/usr/bin/env python
def splitter(filename):
for line in file(filename):
line = line.strip()
if not line: continue
splitted = line.split(None, 3)
yield tuple(splitted[:3]), splitted[3]
access = {}
access_splitter = splitter('access.log')
for k, v in access_splitter:
try:
access[k].append(v)
except KeyError:
access[k] = [v]
events_splitter = splitter('events.txt')
for k, v in events_splitter:
try:
urls = access[k]
except KeyError:
urls = []
print ' '.join(k), v, ' '.join(urls)
Mohl bys udělat rychlostní test? Teda pokud je to vůbec správně ...
grep|awk je tzv. chujovina.
awk "/$x1 $x2 $x3/ { print $4 }"
ciladresy=`cat /var/www-ssl/admin/access.log`bych dal
ciladresy=$(</var/www-ssl/admin/access.log)a místo
for x in `grep -v ^# $SOURCE | awk [...]`; dotohle
awk '!/^#/ [...]' $SOURCE | while read x; do
root@amd64 ~ # time grep -v ALL /etc/hosts.deny | awk '{print$1}'
sshd:
real 0m2.667s
user 0m2.566s
sys 0m0.014s
root@amd64 ~ # time awk '!/ALL/ {print$1}' /etc/hosts.deny
sshd:
real 0m0.006s
user 0m0.004s
sys 0m0.002s
grep "${arr[0]} ${arr[1]} ${arr[2]}" "$ciladresy" | awk '{ print $4 }'
Při použití awk mi to nefunguje vůbec. Nelíbí se mu ${arr[0]} ${arr[1]} ${arr[2]}. Při použití textu to funguje.
awk "/${arr[0]} ${arr[1]} ${arr[2]}/ { print $4 }" "$ciladresy"Nešlo ti to patrně proto, žes zapomněl, že bash proměnný v apostrofech neexpanduje.
awk: line 1: syntax error at or near :Při použití ' se skript provede, ale nefunguje asi kvůli těm chybějícím mezerám.
kvůli těm chybějícím mezerám.Huh?
02/02/2007v ty první proměnný, přičemž 02\/02\/2007 bere v pohodě. Teď jak ho přimět, aby to ignoroval či jak to rychle nahradit.
hm="${arr[0]} ${arr[1]} ${arr[2]}"
hm="${hm//\//\/}"
awk "/$hm/ {print $1}" něco
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.