Apache AWK过滤器x按小时分组

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

我试图按小时获得访问日志的点击率,但在我的日志中有一些我想忽略的行(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 | 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