首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要来自一个文件的子字符串模式的grep帮助,并与另一个文件进行匹配以查看模式是否存在

需要来自一个文件的子字符串模式的grep帮助,并与另一个文件进行匹配以查看模式是否存在
EN

Stack Overflow用户
提问于 2015-04-17 21:41:01
回答 1查看 55关注 0票数 1

我有一个这样的输入平面文件,其中有很多行:

代码语言:javascript
复制
Apr  3 13:30:02 aag8-ca-acs01-en2 CisACS_01_PassedAuth p1n5ut5s 1 0   Message-Type=Authen OK,User-Name=joe7@it.test.com,NAS-  IP-Address=4.196.63.55,Caller-ID=az-4d-31-89-92-90,EAP Type=17,EAP Type Name=LEAP,Response Time=0,
Apr  3 13:30:02 aag8-ca-acs01-en2 CisACS_01_PassedAuth p1n6ut5s 1 0 Message-Type=Authen OK,User-Name=bobe@jg.test.com,NAS-IP-Address=4.197.43.55,Caller-ID=az-4d-4q-x8-92-80,EAP Type=17,EAP Type Name=LEAP,Response Time=0,
Apr  3 13:30:02 abg8-ca-acs01-en2 CisACS_01_PassedAuth p1n4ut5s 1 0 Message-Type=Authen OK,User-Name=jerry777@it.test.com,NAS-IP-Address=7.196.63.55,Caller-ID=az-4d-n6-4e-y2-90,EAP Type=17,EAP Type Name=LEAP,Response Time=0,
Apr  3 13:30:02 aca8-ca-acs01-en2 CisACS_01_PassedAuth p1n4ut5s 1 0 Message-Type=Authen OK,User-Name=frctom@pe.test.com,NAS-IP-Address=4.196.263.55,Caller-ID=az-4d-x1-d3-c2-90,EAP Type=17,EAP Type Name=LEAP,Response Time=0,
Apr  3 13:30:02 aag8-ca-acs01-en2 CisACS_01_PassedAuth p1n4ut5s 1 0 Message-Type=Authen OK,User-Name=frc77@xed.test.com,NAS-IP-Address=4.136.163.55,Caller-ID=az-4d-4w-b5-s2-90,EAP Type=17,EAP Type Name=LEAP,Response Time=0,
Apr  3 13:30:02 aag8-ca-acs01-en2 CisACS_01_PassedAuth p1n4ut5s 1 0 Message-Type=Authen OK,User-Name=petejg@it.test.com,NAS-IP-Address=4.136.62.55,Caller-ID=az-4e-31-x3-92-c0,EAP Type=17,EAP Type Name=LEAP,Response Time=0

我正在尝试grep来自输入文件的电子邮件地址,以查看它们是否已经存在于主文件中。

主平面文件如下所示:

代码语言:javascript
复制
a44e31999290;frc777o.@it.test.com;20150403
az4d4qx89280;bobe@jg.test.com;20150403
0dbgd0fed04t;rrfuf@us.test.com;20150403
28cbe9191d53;rttuu4en@us.test.com;20150403
az4d4wb5s290;frc77@xed.test.com;20150403
d89695174805;ccis6n@cn.test.com;20150403
s00dbg0fe04t;rrfuuuf@be.test.com;20150403

如果电子邮件在master中不存在,我想要一个简单的计数。因此,使用这些示例,我希望看到`count=5 (bobe@jg.test.com和frc77@xed.test.com存在于`count=5中,而其他的不存在)。

我已经尝试了grep的各种组合,下面的是我上次测试的组合,但它仍然不起作用。我在perl脚本中使用它首先捕获电子邮件,然后对它们进行计数,但我真正需要的是来自输入文件的电子邮件的计数,这些电子邮件不存在于master中。

grep -o -P '(?<=User-Name=\).*(?=,NAS-IP-)' $infile $mstr > $new_emails

任何帮助都会很感谢,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-04-27 23:14:26

这不完全是一行,但这对我很有效:

代码语言:javascript
复制
for email in $(sed "s/.*User-Name=\(.[^,]*\),.*/\1/g" input.txt); do
grep -oc $email master.txt
done | sort | uniq -c | awk '{if ($2==0) print $1}' 

说明:

sed命令从输入文件中获取一个干净的电子邮件地址列表:

代码语言:javascript
复制
$ sed "s/.*User-Name=\(.[^,]*\),.*/\1/g" input.txt
joe7@it.test.com
bobe@jg.test.com
jerry777@it.test.com
frctom@pe.test.com
frc77@xed.test.com
petejg@it.test.com

grep命令在主文件中查找这些地址中的每个地址,并且(由于使用了-c标志)返回0表示不匹配,返回1表示匹配:

代码语言:javascript
复制
$ for email in $(sed "s/.*User-Name=\(.[^,]*\),.*/\1/g" input.txt); do 
$ grep -oc $email master.txt 
$ done
0
1
0
0
1
0        

sort和uniq命令获取匹配和不匹配的频率:

代码语言:javascript
复制
$ |sort | uniq -c 
4 0
2 1

最后,awk命令会打印出不匹配的数量(仅当第二列为0时才会打印第一列):

代码语言:javascript
复制
$ awk '{if ($2==0) print $1}' 
4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29700915

复制
相关文章

相似问题

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