首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算字符串的grep结果,但指定排除项?

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

Stack Overflow用户
提问于 2013-02-07 17:59:14
回答 3查看 120关注 0票数 0

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

代码语言:javascript
复制
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以外的所有中继

输出应如下所示

代码语言:javascript
复制
total relay= 6

mx3.xyz.com = 2

mx1.xyz.com = 2

mx2.xyz.com = 1

home.xyz.abc.com = 1
EN

回答 3

Stack Overflow用户

发布于 2013-02-07 18:02:45

如果您不介意使用awk:

代码语言:javascript
复制
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来凑合使用,尽管您不会以这种方式获得总数:

代码语言:javascript
复制
 grep relay maillog  | cut -d= -f2 | grep -v 127.0.0.1 | uniq -c

如果您不讨厌perl:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-02-07 18:03:36

这就是了:

代码语言:javascript
复制
 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

输出将为:

代码语言:javascript
复制
total relay=6
mx2.xyz.com=1
mx1.xyz.com=2
mx3.xyz.com=2
home.xyz.abc.com=1
票数 2
EN

Stack Overflow用户

发布于 2013-02-07 22:29:22

我肯定会使用awk (@Faiz的答案)。但是我想出了这条令人痛苦的管道

代码语言:javascript
复制
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

输出

代码语言:javascript
复制
total = 6
mx3.xyz.com = 2
mx2.xyz.com = 1
mx1.xyz.com = 2
home.xyz.abc.com = 1

请不要对此答案投赞成票;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14748256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档