我想比较这两个文件,只打印这一行并将其附加到“source.txt”:
01.02.70 08h00,4.4.4.4,443
这是我的文件:
源文件.txt
DATETIME,IPSOURCE,PORT 01.01.70 08h00,0.0.0.0,443 01.01.70 08h00,2.2.2.2,443
事件.txt
DATETIME,IPSOURCE,PORT 01.02.70 09h00,0.0.0.0,443 01.02.70 09h00,2.2.2.2,443 01.02.70 08h00,4.4.4.4,443
我不关心比较中的 DATETIME 字段,我只想将日志文件“events.txt”中出现的新 IP 添加到“source.txt”(地址 0.0.0.0 和 2.2.2.2 出现在两个文件)。
所以我想用
grep -vxFf source.txt events.txt
在不考虑第一个字段的情况下,我仅查找 IPSOURCE 字段(第二列)中的差异。
答案1
awk
当您需要基于字段的比较时使用
$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
-F,
设置,
为输入字段分隔符NR==FNR{ip[$2]=$0; next}
使用第二个字段作为键并将整行保存在关联数组中。此代码块仅针对第一个文件输入(即 events.txt)执行$2 in ip{delete ip[$2]}
当第二个文件(即 source.txt)正在处理时,ip
如果第二个字段已存在,则删除数组中的元素END{for(k in ip) print ip[k]}
处理完所有输入后,打印ip
数组中剩余的行
或者,如果 source.txt 中不存在第二个字段,则更改输入文件的顺序并打印 events.txt 中的行
$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443
答案2
只需执行以下操作:
awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source
如果您想基于带有逗号分隔字段的第二列附加差异行,只需>> source
在上面的命令中取消注释即可。
不,如果您想根据 IP:端口部分进行比较。然后你可以使用如下。
awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source
答案3
根据你的条件:
将其附加到“source.txt”
我只想添加新的日志文件“events.txt”到“source.txt”中显示的 IP
这是一个基于GNU结合的完整解决方案sed,切和grep:
sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt
生成的source.txt
文件内容:
DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443