如何计算字符串的grep结果,但是指定排除?

时间:2013-02-07 09:59:14

标签: shell sorting count awk uniq

我的maillog文件包含以下参数

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

3 个答案:

答案 0 :(得分:3)

如果您不介意使用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

你也可以只使用uniqgrep,但你不会这样做:

 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

答案 1 :(得分:2)

你去:

 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

答案 2 :(得分:0)

我肯定会使用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

请不要支持这个答案;)