Diff命令与Grep一起提供“二进制文件(标准输入)匹配项”

时间:2019-08-01 08:21:25

标签: linux shell unix command-line grep

我试图结合使用diff命令和grep命令来查找2个文件之间的差异。换句话说,我有昨天的文件和今天的文件,我需要找到今天文件中新的行,即昨天文件中不存在的行。

我正在使用以下命令将所需的输出放入文件'diff.TXT':

diff  <(sed '1d' 'todayFile.txt' | sort ) <(sed '1d' yesterdayFile.txt | sort ) | grep "^<"  >> 'diff.TXT'

这很好用,直到今天它产生的'diff.TXT'为:

Binary file (standard input) matches

这是在我的产品环境中发生的,但在测试环境中有效。 因此,我尝试通过在测试环境中分解命令来对此进行一些调试。

我将最初的命令分为两部分:

diff  <(sed '1d' 'todayFile.txt' | sort ) <(sed '1d' yesterdayFile.txt | sort ) > temp.txt
grep "^<" temp.txt

a,我现在在测试环境中遇到与生产产品相同的错误。

Binary file (standard input) matches

这对我来说似乎很奇怪。

在测试环境中,我通过拆分命令来尝试发现的一件奇怪的事情是,在执行file -i temp.txt时,它会给出二进制。

有人可以帮忙吗

1 个答案:

答案 0 :(得分:1)

来自man grep

  

-a,--text

     

像对待文本一样处理二进制文件;这等效于--binary-files = text选项。

     

-binary-files = TYPE

     

如果文件的前几个字节指示该文件包含二进制数据,请假定该文件的类型为TYPE。默认情况下,TYPE为   二进制文件,而grep通常会输出单行消息说   二进制文件是否匹配,如果不匹配,则不显示消息。如果   TYPE是不匹配的,grep假定二进制文件不匹配;   这等效于-I选项。如果TYPE是text,则grep处理   二进制文件,就像文本一样;这等效于-a选项。   警告:grep --binary-files = text可能会输出二进制垃圾,该垃圾会   如果输出是终端并且如果   终端驱动程序会将其中一些解释为命令。

grep扫描文件,如果发现任何不可读的字符,则假定文件为二进制文件。将-a开关添加到grep,使其将文件视为可读文本。您的输入文件很可能包含一些不可读的字符。

  

diff <(sed'1d''todayFile.txt'| sort)<(sed'1d'昨天File.txt | sort)| grep“ ^ <”

会不会comm -13 <(...) <(...)更快更简单?