我有一个有很多行的输入平面文件:
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如果电子邮件不存在的主人,我想要一个简单的计数。
因此,使用我希望看到的例子:count=3,因为bobe@jg.test.com和frc77@xed.test.com已经存在于master中,而其他的则不存在。
我尝试了各种grep组合,下面的例子来自上一次测试,但它不起作用。我在perl脚本中使用grep来首先捕获电子邮件,然后对它们进行计数,但我真正需要的是统计来自输入文件的电子邮件,这些邮件在主程序中是不存在的。
grep -o -P '(?<=User-Name=\).*(?=,NAS-IP-)' $infile $mstr > $new_emails;任何帮助都将不胜感激,谢谢。
发布于 2015-04-17 16:07:10
我会在awk中使用这种方法
$ awk 'FNR==NR {FS=";"; a[$2]; next}
{FS="[,=]"; if ($4 in a) c++}
END{print c}' master file
3这是通过设置不同的字段分隔符和存储/匹配电子邮件来实现的。然后打印最后的金额。
对于master文件,我们使用;并获得第二个字段:
$ awk -F";" '{print $2}' 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文件(包含所有信息的文件),我们使用,或=,并获得第四个字段:
$ awk -F[,=] '{print $4}' file
joe7@it.test.com
bobe@jg.test.com
jerry777@it.test.com
frc777o.@it.test.com
frc77@xed.test.com发布于 2015-04-17 18:29:43
考虑到下面的内容,您可以使用diff和perl作为一个整体来完成您想做的事情:
diff <( perl -F';' -anE 'say @F[1]' master | sort -u ) <( perl -pe 'm/User-Name=([^,]+),/; $_ = "$1\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=([^,]+),/; $_ = "$1\n"'获取您想要的特定字段,忽略周围的key=,并隐式地在新行上打印。
https://stackoverflow.com/questions/29703524
复制相似问题