我有这个命令来解析一个日志文件,并显示每个IP地址和IP地址在日志文件中的次数。
for x in $(cat /var/log/varnish/varnishncsa.log | awk '{print $1}' | uniq); do cat /var/log/varnish/varnishncsa.log | awk -v q=, "/$x/ { count++ } END { print $x q count }";done
它工作正常,除了AWK在输出上添加零。
e.g。输出
198.530.980.148,3
72.140.1990.7,29
应该是:
198.53.98.148,3
72.14.199.7,29
即。 198.53.98.148由AWK(额外零)转换为198.530.980.148,或72.14.199.7转换为72.140.1990.7。
非常感谢任何帮助或见解。
由于 保罗
更新
请注意以下Ed的非常有用的替代脚本:
awk -v OFS=, '{cnt[$1]++} END{for (x in cnt) print x, cnt[x]}' /var/log/varnish/varnishncsa.log
它比我的快得多。
我保留了答案,因为从技术上讲,我的错误语法是错误。
答案 0 :(得分:4)
您的整个命令行可以简化为:
awk -v OFS=, '{cnt[$1]++} END{for (x in cnt) print x, cnt[x]}' /var/log/varnish/varnishncsa.log
答案 1 :(得分:2)
好吧,我不知道你的输入文件,但这个awk命令:
awk -v q=, "/$x/ { count++ } END { print $x q count }"
绝对不正确。您需要使用与传递变量$x
相同的-v
选项传递q
。
试试这个awk命令:
awk -v x="$x" -v q="," '$0 ~ x { count++ } END { print x q count }'
很可能所有脚本都可以用一个awk命令编写,并且不需要不必要的cat, awk, uniq
等。