我正在比较两个文件的结果,其中一个是不在另一个文件中使用的 grep -v -f file1.txt file2.txt > result.txt
假设我的文件看起来像;
FILE1.TXT
alex
peter
zoey
Run Code Online (Sandbox Code Playgroud)
FILE2.TXT
alex
john
peter
zoey
Run Code Online (Sandbox Code Playgroud)
所以result.txt应该包含john
这是在Jenkins工作中运行的,result.txt如果两者之间没有差异,jenkins最终不满意创建一个空.
我不能只做一个盲目差异/无差异输出,我特别需要知道哪些线路有所不同.
如果没有结果,是否有更简洁的方法来运行此命令以不创建文件?
你可以做一些像删除文件一样简单的事情吗?
解决方案#1:
grep -v -f file1.txt file2.txt > result.txt
[[ $? -ne 0 ]] && 'rm' -f result.txt
Run Code Online (Sandbox Code Playgroud)
rm命令以确保不调用任何别名-f如果文件不存在,请使用保持静默的任何消息(不应该发生,但不会对此代码造成伤害)解决方案#2:
grep -v -f file1.txt file2.txt > result.txt
[[ ! -s result.txt ]] && 'rm' -f result.txt
Run Code Online (Sandbox Code Playgroud)
-s =>文件存在且大小大于0! -s =>文件不存在或文件存在且大小为0'rm' -f ......与解决方案#1相同的解释编辑:尝试使用安静选项 -q 有条件地运行命令(当找到一个匹配项时将退出并节省时间)。然后,一旦找到第一个匹配项(意味着文件不同),您将运行相同的命令并将其输出到文件中。
试试这个:(编辑摘自查尔斯·达菲的评论)
#!/usr/bin/env bash
if grep -qvf file1.txt file2.txt
then
grep -vf file1.txt file2.txt > output.txt
echo "Differences exist. File output.txt created."
else
echo "No difference between the files detected"
fi
Run Code Online (Sandbox Code Playgroud)
或者用更少的代码和一行:
grep -qvf file1.txt file2.txt && grep -vf file1.txt file2.txt > output.txt
Run Code Online (Sandbox Code Playgroud)