awk添加零

时间:2013-11-27 13:55:06

标签: bash awk

我有这个命令来解析一个日志文件,并显示每个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

它比我的快得多。

我保留了答案,因为从技术上讲,我的错误语法是错误。

2 个答案:

答案 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等。