如果没有结果,如何停止grep创建空文件

Ale*_*lex 3 bash grep

我正在比较两个文件的结果,其中一个是不在另一个文件中使用的 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最终不满意创建一个空.

我不能只做一个盲目差异/无差异输出,我特别需要知道哪些线路有所不同.

如果没有结果,是否有更简洁的方法来运行此命令以不创建文件?

mar*_*rkp 5

你可以做一些像删除文件一样简单的事情吗?

解决方案#1:

grep -v -f file1.txt file2.txt > result.txt
[[ $? -ne 0 ]] && 'rm' -f result.txt
Run Code Online (Sandbox Code Playgroud)
  • grep应该为空输出生成非零返回码
  • 引用该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相同的解释

  • 最好使用`if!grep ...; 那么rm`或`grep ... || rm`并且不需要明确地检查`$?`; 检查`$?`的代码是脆弱的 - 添加`echo`s以改进日志记录可能会破坏它,并且需要遵循更多上下文(垂直读取而不是水平读取)来理解碎片是如何连接的. (2认同)

9Br*_*ker 5

编辑:尝试使用安静选项 -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)