两个文件中的子字符串模式匹配

Substring pattern matching in two files

我有一个像这样的多行输入平面文件:

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=frc777o.@it.test.com,NAS-IP-Address=4.196.263.55,Caller-ID=a4-4e-31-99-92-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,

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

主平面文件如下所示:

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

如果 master 中不存在该电子邮件,我想要一个简单的计数。

所以使用我希望看到的示例:count=3,因为 bobe@jg.test.comfrc77@xed.test.com 已经存在于 master 中,但其他的不存在。

我尝试了 grep 的各种组合,下面是上次测试的示例,但它不起作用。我在 perl 脚本中使用 grep 首先捕获电子邮件,然后计算它们,但我真正需要的是计算来自主文件中不存在的输入文件的电子邮件。

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

任何帮助将不胜感激,谢谢。

我会在 awk 中使用这种方法:

$ awk 'FNR==NR {FS=";"; a[]; next}
       {FS="[,=]"; if ( in a) c++}
       END{print c}' master file
3

这通过设置不同的字段分隔符和存储/匹配电子邮件来实现。然后,打印最后的总和。

对于 master 文件,我们使用 ; 并获取第二个字段:

$ awk -F";" '{print }' master 
frc777o.@it.test.com
bobe@jg.test.com
rrfuf@us.test.com
rttuu4en@us.test.com
frc77@xed.test.com
ccis6n@cn.test.com

对于 file 文件(包含所有信息的文件),我们使用 ,= 并获得第 4 个字段:

$ awk -F[,=] '{print }' file
joe7@it.test.com
bobe@jg.test.com
jerry777@it.test.com
frc777o.@it.test.com
frc77@xed.test.com

认为下面的内容可以作为一个包含 diff 和 perl 的单行代码来实现:

diff <( perl -F';' -anE 'say @F[1]' master | sort -u ) <( perl -pe 'm/User-Name=([^,]+),/; $_ = "\n"' data | sort -u ) | grep '^>' | perl -pe 's/> //;'

diff <( command_a |sort -u ) <( command_b |sort -u) | grep '>'让您处理命令输出的设置差异。

perl -F';' -anE 'say @F[1]' 只是将文件的每一行拆分为 ';'并在其自己的行上打印第二个字段。

perl -pe 'm/User-Name=([^,]+),/; $_ = "\n"' 获取您想要忽略周围 key= 的特定字段并隐式地在新行上打印。