Apache AWK过滤器x按小时分组
我试图按小时获得访问日志的点击率,但在我的日志中有一些我想忽略的行(css/js/etc…) 如果我跑步:Apache AWK过滤器x按小时分组,apache,awk,Apache,Awk,我试图按小时获得访问日志的点击率,但在我的日志中有一些我想忽略的行(css/js/etc…) 如果我跑步: grep "31/Mar" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2}' | sort -n | uniq -c 具有预期的结果,如: 但如果我添加过滤器: grep "31/Mar" access_log | cut -d[ -f2 | cut -d] -f1 | a
grep "31/Mar" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2}' | sort -n | uniq -c
具有预期的结果,如:
但如果我添加过滤器:
grep "31/Mar" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F '!/.pdf|.css|.png|.jpg|.js/': '{print $2}' | sort -n | uniq -c
结果是一行
7496
我做错了什么?你可能想写:
awk -F':' '!/\.(pdf|css|png|jpg|js)$/{print $2}'
但是您的脚本中还有其他问题,我们可以在给定的MCVE中帮助您。所有这些长管道都可以在单个
awk
中完成,如下所示:
awk-F:'!/\。(pdf | css | png | jpg | js)$/&&&/31\/Mar/{++freq[$4]}
结束{for(f in freq)print f,freq[f]}'访问日志
12 8
13 2
14 1
我的错误。。。
在测试之后,我注意到问题是grep。
如果我优化grep,我可以忽略行并正确地在结果下应用awk
grep -Ev ".js|.css|.jpg|.png|.pdf" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F : '{print $2}' | sort -n | uniq -c
谢谢你的努力。请在你的问题中发布一些日志样本,让我们更好地了解你的问题。谢谢。
-F'!/。pdf |.css |.png |.jpg |.js/':
没有意义-这是一个条件,不是regexp。正如@Ravinder所说的,请发布一个包含简明、可测试的示例输入(内容为access\u log
)和预期输出的文档。@RavinderSingh13是apache中的一个常见日志文件,我想read@EdMorton可以使用任何标准访问日志,并将其视为目标的样本,我展示的第一个命令运行良好,您可以在访问日志上正常复制它。不要假设那些awk专家有兴趣帮助您拥有这样一个“标准访问日志”,甚至现在也不知道“apache”是什么。当你问一个问题时,你必须提供样本输入和给定输入的预期输出,这样我们就有了可以测试潜在解决方案的东西。否则,你就大大限制了愿意/能够帮助你的人。看看这是否不清楚。不起作用,因为加载的文件必须作为文本传递,以拆分参数,而不是带引号的字符串。我不知道这意味着什么,您必须更好地询问您的问题,以便我们能够帮助您。谢谢,但我发现了我的错误…如果我改进grep,如果瑞士刀具awk
已经在使用,则不应使用grep
。如果可以在一条注释中完成,为什么要通过在管道中运行6个命令来使它变得复杂和缓慢呢?您的grep命令不会执行您认为它可以执行的操作,因此在使用awk时,某些输入将失败,并且您不需要grep+2*cut+3管道等。
grep -Ev ".js|.css|.jpg|.png|.pdf" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F : '{print $2}' | sort -n | uniq -c