Linux下如何用grep对比两个文件并将结果写入其中一个文件
你无法直接重定向写入的核心原因是shell执行命令的优先级:当你在命令中使用>重定向符时,shell会首先清空目标文件,再执行grep命令。这时候grep读取的已经是被清空的源文件,自然无法得到预期结果。
以下是可用的解决方法:
方法1:临时文件中转(全平台通用,最稳妥)
先把grep输出写入临时文件,确认命令执行成功后再覆盖目标文件,兼容性最好,所有Unix-like系统都支持:
# 示例为将结果覆盖写入file1.txt,写入file2.txt改最后文件名即可 grep -vf file1.txt file2.txt > tmp_result && mv tmp_result file1.txt
说明:&& 保证只有grep执行成功时才会覆盖原文件,避免因命令执行失败损坏原文件。
方法2:使用grep内置输出参数(仅GNU grep可用)
如果你用的是Linux默认带的GNU grep(3.8及以上版本),可以用grep自带的--output参数,由grep自身处理文件写入,不会提前清空源文件:
grep -vf file1.txt file2.txt --output=file1.txt
方法3:使用sponge工具
sponge是moreutils工具包中的组件,特性是会读取完前序命令的所有输出后,再写入目标文件,不会提前清空文件:
首先安装moreutils:
# Debian/Ubuntu 系 apt install moreutils # CentOS/RHEL 系 dnf install moreutils
使用命令:
grep -vf file1.txt file2.txt | sponge file1.txt
注意:覆盖写入操作不可逆,建议先单独执行grep命令确认输出符合预期,再执行写入操作,重要文件操作前请提前备份。
内容的提问来源于stack exchange,提问作者mv402506
相关产品推荐
相关产品推荐

