我有一个带有以下参数的邮件日志文件
relay=mx3.xyz.com
relay=mx3.xyz.com
relay=mx1.xyz.com
relay=mx1.xyz.com
relay=mx2.xyz.com
relay=home.xyz.abc.com
relay=127.0.0.1我想计算除127.0.0.1以外的所有中继
输出应如下所示
total relay= 6
mx3.xyz.com = 2
mx1.xyz.com = 2
mx2.xyz.com = 1
home.xyz.abc.com = 1发布于 2013-02-07 18:02:45
如果您不介意使用awk:
awk -F= '$2 != "127.0.0.1" && /relay/ {count[$2]++; total++}
END { print "total relay = "total;
for (k in count) { print k" = " count[k]}
}' maillog您也可以仅使用uniq和grep来凑合使用,尽管您不会以这种方式获得总数:
grep relay maillog | cut -d= -f2 | grep -v 127.0.0.1 | uniq -c如果您不讨厌perl:
perl -ne '/relay=(.*)/ and $1 ne "127.0.0.1" and ++$t and $h{$1}++;
END {print "total = $t\n";
print "$_ = $h{$_}\n" foreach keys %h;
}' maillog发布于 2013-02-07 18:03:36
这就是了:
awk -F= '$2!="127.0.0.1"&&$2{t++;a[$2]++} END{print "total relay="t; for(x in a)print x"="a[x]}' yourfile输出将为:
total relay=6
mx2.xyz.com=1
mx1.xyz.com=2
mx3.xyz.com=2
home.xyz.abc.com=1发布于 2013-02-07 22:29:22
我肯定会使用awk (@Faiz的答案)。但是我想出了这条令人痛苦的管道
cut -d= -f2 filename | grep -v -e '^[[:space:]]*$' -e 127.0.0.1 | sort | uniq -c | tee >(echo "$(bc <<< $(sed -e 's#[[:alpha:]].\+$#+#' -e '$a0')) total") | sed 's/^ *\([0-9]\+\) \(.*\)/\2 = \1/' | tac输出
total = 6
mx3.xyz.com = 2
mx2.xyz.com = 1
mx1.xyz.com = 2
home.xyz.abc.com = 1请不要对此答案投赞成票;)
https://stackoverflow.com/questions/14748256
复制相似问题