Portál AbcLinuxu, 29. července 2025 09:26
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 donevzor /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.htmlps: 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, urlDá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.
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.