Linux下如何对比两个文件 筛选File1中未在File2出现的IP并输出CSV
问题根源
你原来的grep命令失效的核心原因是-x参数要求整行完全匹配,File2里每一行只有IP地址,而File1的每一行是「名称+空格+IP」的格式,二者整行内容不可能匹配,所以grep认为File1所有行都不存在于File2中,直接全部输出了。
最优实现方案
方案1:awk 单命令实现(推荐)
不需要提前处理文件,一次执行即可完成筛选,同时可以直接输出标准CSV格式,执行效率远高于多命令组合:
awk 'NR==FNR {ip[$1]=1; next} !ip[$2]' File2.txt File1.txt > not-in-File2.csv
命令解释:
NR==FNR {ip[$1]=1; next}:优先读取第一个文件File2.txt,把所有IP存入名为ip的哈希表中!ip[$2]:读取第二个文件File1.txt时,判断当前行第二列的IP不在哈希表中,就输出整行内容- 如果需要输出逗号分隔的标准CSV格式,调整命令即可:
awk 'NR==FNR {ip[$1]=1; next} !ip[$2] {print $1","$2}' File2.txt File1.txt > not-in-File2.csv
输出的内容就是符合CSV规范的name2,12.90.543.87格式。
方案2:修正后的grep 实现
如果要继续用grep实现,需要去掉-x参数,同时加行尾锚点避免IP部分匹配的问题:
grep -vFf <(sed 's/$/$/' File2.txt) File1.txt > not-in-File2.csv
命令解释:
- 用
sed给File2的每一行IP末尾加$锚点,确保只匹配行尾的IP,避免出现IP片段误匹配的问题 - 去掉
-x参数,取消整行匹配限制 -v参数输出不匹配的行
内容的提问来源于stack exchange,提问作者Somethingwhatever
相关产品推荐
相关产品推荐

