我试图结合使用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
时,它会给出二进制。
有人可以帮忙吗
答案 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 <(...) <(...)
更快更简单?