【问题标题】:How do I count grep results for a string, but specify exclusions?如何计算字符串的 grep 结果,但指定排除项?
【发布时间】:2013-02-07 09:59:13
【问题描述】:

我有以下参数的邮件日志文件

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

【问题讨论】:

  • 您使用什么语言工作?你试过什么?
  • 亲爱的 faiz,感谢您的帮助,但您的脚本给了我邮件 ID 和中继计数。
  • 你真的在源文件中有那些空行吗?

标签: shell sorting count awk uniq


【解决方案1】:

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

【讨论】:

  • 输入有空行,您的解决方案也会打印这些空行数。
  • 我想从我的邮件日志中 grep relay=anything(上面给出的问题),但不应该 127.0.0.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

【讨论】:

    【解决方案3】:

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

    请不要赞成这个答案;)

    【讨论】:

    • 我认为这是一个绝妙的 hack!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2013-04-19
    • 2020-05-31
    • 1970-01-01
    • 2021-10-27
    • 2013-09-29
    相关资源
    最近更新 更多