自动清洗数据并生成goaccess的统计页面的脚本shell
goaccess是一个可以统计nginx访问日志的软件,并且生成一个html的统计页面,很方便查看。goaccess根据请求的url(包含参数)统计,这样的统计往往不是我们想要的,比如一个用户信息的接口会还上用户的ID,每个用户的ID不一样,goaccess会针对一个用户的请求都独立统计,这不是我们想要的统计,我们想知道用户信息的接口总请求次数怎么办?我们要先清洗一遍日志,把参数全部清除后再给goaccess统计,这样的结果就能更利于我们观察。
如果需要清理的场景很多,手工操作就非常麻烦,我们需要把这些命令做成shell脚本,每次想统计的时候让它自动执行。下面是我写的一份脚本
#!/bin/bash
#先清掉上次拷贝出来的日志
rm -f /logs_clear/www.weinidai.com.access.$(date +%Y-%m-%d_%H).log
#拷贝出日志,按日命名日志文件
cp /logs/www.weinidai.com.access.log /logs_clear/www.weinidai.com.access.$(date +%Y-%m-%d_%H).log
#清除所有参数
sed -i 's/\?.* HTTP/ HTTP/g' /logs_clear/*.log
#把文章ID替换成统计的点位符
sed -i 's/\/h5\/endorsers\/[0-9]*/\/h5\/endorsers\/{post_id}/g' /logs_clear/*.log
sed -i 's/\/h5\/endorse\/[0-9]*/\/h5\/endorse\/{post_id}/g' /logs_clear/*.log
sed -i 's/\/h5\/vcf\/[0-9]*/\/h5\/vcf\/{post_id}/g' /logs_clear/*.log
sed -i 's/\/h5\/vcf\/downloadQR\/[0-9]*/\/h5\/vcf\/downloadQR\/{post_id}/g' /logs_clear/*.log
sed -i 's/\/h5\/vcf\/file\/[0-9]*/\/h5\/vcf\/file\/{post_id}/g' /logs_clear/*.log
sed -i 's/\/h5\/role\/[0-9]*/\/h5\/role\/{post_id}/g' /logs_clear/*.log
#把需要保留不变的接口地址修改为特殊的标记,即前面加上10个3,方便后面做用户个人的话题主页的识别
sed -i 's/weinidai\.com\"; \"GET \/uc/weinidai\.com\"; \"GET 3333333333\/uc/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/api/weinidai\.com\"; \"GET 3333333333\/api/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/im/weinidai\.com\"; \"GET 3333333333\/im/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/document/weinidai\.com\"; \"GET 3333333333\/document/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/applet/weinidai\.com\"; \"GET 3333333333\/applet/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/h5/weinidai\.com\"; \"GET 3333333333\/h5/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/neteaseMsg/weinidai\.com\"; \"GET 3333333333\/neteaseMsg/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/test/weinidai\.com\"; \"GET 3333333333\/test/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/inner/weinidai\.com\"; \"GET 3333333333\/inner/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/appConfig/weinidai\.com\"; \"GET 3333333333\/appConfig/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/apple/weinidai\.com\"; \"GET 3333333333\/apple/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/\.well/weinidai\.com\"; \"GET 3333333333\/\.well/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/favicon\.ico/weinidai\.com\"; \"GET 3333333333\/favicon\.ico/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/cn/weinidai\.com\"; \"GET 3333333333\/cn/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/robots\.txt/weinidai\.com\"; \"GET 3333333333\/robots\.txt/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/fonts/weinidai\.com\"; \"GET 3333333333\/fonts/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/css/weinidai\.com\"; \"GET 3333333333\/css/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/js/weinidai\.com\"; \"GET 3333333333\/js/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET \/M\-icon\.ico/weinidai\.com\"; \"GET 3333333333\/M\-icon\.ico/g' /logs_clear/*.log
#把用户个人的话题主页(用户名/话题名)接口统一替换成h5-user-page
sed -i 's/weinidai\.com\"; \"GET \/.* HTTP/weinidai\.com\"; \"GET \/h5-user-page HTTP/g' /logs_clear/*.log
#把刚刚做了特殊的标记的接口还原
sed -i 's/weinidai\.com\"; \"GET 3333333333\/uc/weinidai\.com\"; \"GET \/uc/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/api/weinidai\.com\"; \"GET \/api/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/im/weinidai\.com\"; \"GET \/im/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/document/weinidai\.com\"; \"GET \/document/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/applet/weinidai\.com\"; \"GET \/applet/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/h5/weinidai\.com\"; \"GET \/h5/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/neteaseMsg/weinidai\.com\"; \"GET \/neteaseMsg/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/test/weinidai\.com\"; \"GET \/test/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/inner/weinidai\.com\"; \"GET \/inner/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/appConfig/weinidai\.com\"; \"GET \/appConfig/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/apple/weinidai\.com\"; \"GET \/apple/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/\.well/weinidai\.com\"; \"GET \/\.well/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/favicon\.ico/weinidai\.com\"; \"GET \/favicon\.ico/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/cn/weinidai\.com\"; \"GET \/cn/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/robots\.txt/weinidai\.com\"; \"GET \/robots\.txt/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/fonts/weinidai\.com\"; \"GET \/fonts/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/css/weinidai\.com\"; \"GET \/css/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/js/weinidai\.com\"; \"GET \/js/g' /logs_clear/*.log
sed -i 's/weinidai\.com\"; \"GET 3333333333\/M\-icon\.ico/weinidai\.com\"; \"GET \/M\-icon\.ico/g' /logs_clear/*.log
#使用goaccess生成html报表
/usr/bin/goaccess /logs_clear/www.weinidai.com.access.$(date +%Y-%m-%d_%H).log -o /data/web/logs.weinidai.com/api-clear-$(date +%Y%m%d).html --real-time-html
#屏幕上输出访问访报表的URL
echo Visit with: http://cn-logs.weinidai.com/api-clear-$(date +%Y%m%d).html
把它放在脚本目录
vim /usr/sbin/test_auto_goaccess
修改它为可执行脚本
chmod +x /usr/sbin/test_auto_goaccess
这样在任何的目录下都可以使用test_auto_goaccess执行该脚本了
如果脚本是在windows下编辑,再上传到linux系统,可能会遇到文件类型不相符导致脚本不能正常运行,可以把报错复制到百度搜索一下,找到解决方案。
sed的正则表达式非常局限,在Notepad中可使用的一些运算在sed命令中是没有的,我研究了半天终于找到了替代方案,以下是Notepad中可执行的相同功能的正则表达式
\?.*?\s | |
/h5/endorsers/\d+ | /h5/endorsers/{post_id} |
/h5/vcf/\d+ | /h5/vcf/{post_id} |
/h5/vcf/downloadQR/\d+ | /h5/vcf/downloadQR/{post_id} |
/h5/vcf/file/\d+ | /h5/vcf/file/{post_id} |
/h5/endorse/\d+ | /h5/endorse/{post_id} |
/h5/role/\d+ | /h5/role/{post_id} |
weinidai\.com\"; \"GET /(?!uc|api|im|document|applet|h5|neteaseMsg|test|inner|appConfig| apple|\.well|favicon\.ico|cn|robots\.txt|fonts|css|js|M\-icon\.ico)\S+ | weinidai.com"; "GET /h5-role-card-page |