通过sort + uniq可以完成内容去重的目的,再加上awk的强大解析功能,可对大量数据进行良好筛选。
cat webx.log.20 | grep com.alibaba.intl.ae.biz.marketing | grep rpc | awk -F "channel:" '{print $2}' | awk '{print $1 "->" $3}' | sort -n | uniq -c | sort -nr
sort 用法:
http://hi.baidu.com/chichushanren/item/9e49cd510e2d829c08be1737
新加shell脚本,用于日志统计。
gmalipay.sh ipayserver 'grep "GET /alipay.alibaba.com/checkout.htm" /home/log/out/logs/cookie_logs/27/cookie_log |grep "****" -c' | awk '{sum=sum+$1} END{print sum}'
业务背景:
分布式机器8台,记录一天的cookie log。需要解析这8台机器上的日志,扫描出来访问正常detail页面和商铺detail页面的产品ID。排除爬虫和不排除爬虫。
附件中包含4个解析日志shell脚本:
解析单个cookie log
analyzeToProductId
批量解压并解析多个cookie log
multest
multestWithOutSpider
将多种解析方案合并到一个文件中
allAnalyze
analyzeToProductId:包含解析cookie log的基础逻辑。将访问detail和store的id解析出来,分别输出到文件。
grep "GET /www.aliexpress.com/wholesaleproduct/wholesaleProductDetail.htm" $1 |grep "productId=[0-9]\{9\}" -o |awk '{split($0,a,"="); print a[2]}' > $1.detail
grep -Eo "GET /www.aliexpress.com/fm-store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/|GET /www.aliexpress.com/store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/" $1 | awk '{split($0,a,"/");split(a[5],b,"-"); print b[2]}' > $1.store
$1:通过命令输入的文件名。
-E, -o: grep参数,-E使用扩展正则表达式语法,支持或逻辑 | 。 -o, 仅将匹配的字符输出到流中。
[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}:grep支持正则表达式。
awk '{split($0,a,"/");split(a[5],b,"-"); print b[2]} :awk语法,awk '/AL/ {print $3,$2}' ,将正则匹配的字符串/AL/ 输入到{}中进行操作。$0,表示输入的字符流。若没有添加正则表达式,则将输入流全部进行{}进行操作。
multest,multestWithOutSpider:批量解压,解析8台机器日志。
for file in ` ls $1 `
do
if [ `echo $file | grep -E ".*\.zip"` ]
then
len=${#file}
temp=${file:0:len-4}
gunzip -c $1/$file > $1/$temp
echo unzip $1/$file to $1/$temp success!
fi
done
echo =========Unzip success!=============
echo =========Analyze begin=============
for file in ` ls $1 `
do
if [ `echo $file | grep -E "cookie_log_[0-9]*_[0-9]*" | grep -v "\."` ]
then
echo ---------------------------start analysising ... $file
start_time=`date +"%Y-%m-%d %H:%M:%S"`
grep "GET /www.aliexpress.com/wholesaleproduct/wholesaleProductDetail.htm" $1/$file |grep "productId=[0-9]\{9\}" -o |awk '{split($0,a,"="); print a[2]}' > $1/$file.detail
grep -Eo "GET /www.aliexpress.com/fm-store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/|GET /www.aliexpress.com/store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/" $1/$file | awk '{split($0,a,"/");split(a[5],b,"-"); print b[2]}' > $1/$file.store
end_time=`date +"%Y-%m-%d %H:%M:%S"`
start=`date -d "$start_time" +%s`
end=`date -d "$end_time" +%s`
echo ---------------------------end analysising $1 time used: `expr $end - $start` seconds
echo
fi
done
gunzip -c $1/$file > $1/$temp:解压。用unzip无法重命名解压出来的文件。
allAnalyze:将普通detail和商铺detail的解析结果合并在一块,并添加爬虫标记。脚本中对每条符合的记录进行if判断,效率比上面的脚本低很多,适合少量数据使用。
grep -E "GET /www.aliexpress.com/wholesaleproduct/wholesaleProductDetail.htm|GET /www.aliexpress.com/fm-store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/|GET /www.aliexpress.com/store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/" $1 |while read line
do
spider=""
if [ `echo $line|grep -E "Googlebot|bingbot|Baiduspider|Yahoo! Slurp|YandexBot|NHN Corp.|ia_archiver|msnbot"` ]
then
spider="/spider"
fi
if echo $line |grep "GET /www.aliexpress.com/wholesaleproduct/wholesaleProductDetail.htm"
then
echo $line | grep "productId=[0-9]\{9\}" -o |awk '{split($0,a,"="); print a[2]$spider}' > $1.all
else
echo $line | grep -Eo "GET /www.aliexpress.com/fm-store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/|GET /www.aliexpress.com/store/[0-9]{5,6}/[0-9P]{1,20}\-[0-9]{9}/" $1 | awk '{split($0,a,"/");split(a[5],b,"-"); print b[2]$spider}' > $1.all
fi
done
|while read line
do:将grep的结果逐行解析处理。