`
zl198751
  • 浏览: 273456 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Shell 脚本实例分析(cookie_log 解析)

 
阅读更多

通过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

 

for file in ` ls $1 `: 遍历脚本输入参数$1对应目录的所有文件.
if [ `echo $file | grep -E ".*\.zip"` ]:判断文件名是否以.zip结尾。 主要需要在命令外加`` 重音符号。
${#file}:变量file的字节长度。
${file:0:len-4}:变量file截取字节,从(0,len-4)。

 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的结果逐行解析处理。

 

分享到:
评论

相关推荐

    shell-work:shell常用分析命令和脚本

    shell-work shell常用分析命令和脚本 ##mysql监控脚本 ##cookielog分析脚本 ##线上java进程信息dump和机器信息dump脚本 ##cpu监控相关 ##dish 磁盘管理

    Advanced Bash-Scripting Guide <>

    一个fork 出多个自己实例的脚本 11-2. printf 11-3. 使用read,变量分配 11-4. 当使用一个不带变量参数的read 命令时,将会发生什么? 11-5. read 命令的多行输入 11-6. 检测方向键 11-7. 通过文件重定向来使用read 11...

    Linux高级bash编程

    非官方的Shell脚本风格 33. 杂项 33.1. 交互式和非交互式的shells和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 ...

    vc++ 开发实例源码包

    MFCHtml 调用脚本 如题。 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信...

    vc++ 应用源码包_5

    从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的...

    vc++ 应用源码包_1

    从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的...

    vc++ 应用源码包_6

    从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的...

    vc++ 应用源码包_2

    从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的...

    vc++ 应用源码包_3

    从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的...

    operations:放松并复制粘贴!

    该项目是脚本的集合,详细描述了以下操作:我可能会忘记/我懒得键入/我想自动化。 免费软件:麻省理工学院 文档: : 。 目录 地位 特征 要求 安装 用法 发展 欢迎捐款! 首先阅读贡献准则。 未来 见...

Global site tag (gtag.js) - Google Analytics