1. ホーム
  2. linux

[解決済み] DiffコマンドとGrepで "バイナリファイル(標準入力)が一致 "と表示される。

2022-01-28 03:04:47

質問

diffコマンドとgrepコマンドを併用して、2つのファイルの差分を求めようとしています。言い換えれば、私は昨日のファイルと今日のファイルを持っています、私は今日のファイルで新しい行を見つける必要があります(すなわち、昨日のファイルにはありませんでした)。

私は、以下のコマンドを使用して、必要な出力をファイル 'diff.TXT' に出力しています。

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

これは今日までうまくいっていたのですが、'diff.TXT'が.TXTとして生成されました。

Binary file (standard input) matches


この現象は私のプロード環境では発生しましたが、テスト環境では動作しています。 そこで、テスト環境でのコマンドを分解してデバッグしてみました。

最初のコマンドを2つの部分に分けてみました。

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

そして残念なことに、prodで出ていたのと同じエラーが現在test環境でも出ています。

Binary file (standard input) matches

これはとても不思議な感じがします。

テスト環境で、コマンドを分割して試したときに気づいた奇妙なことが一つあります。 file -i temp.txt バイナリになります。

どなたか、ご協力をお願いします

解決方法を教えてください。

から man grep :

-a, --text

バイナリファイルをテキストのように処理します。-binary-files=textオプションと同等です。

-バイナリファイル=TYPE

ファイルの最初の数バイトがバイナリデータを含んでいることを示す場合、そのファイルのタイプはTYPEであると仮定します。デフォルトでは、TYPEは バイナリであり、通常、grepは1行のメッセージで バイナリファイルにマッチする場合はメッセージなし, マッチしない場合はメッセージなしとなります。もし TYPEがwithout-matchの場合、バイナリファイルにはマッチしないと判断します。 これは-Iオプションと同じです。TYPEがtextの場合、grepはバイナリファイルを処理します。 バイナリファイルをテキストと同じように扱うことができます。 警告: grep --binary-files=text は、バイナリのゴミを出力するかもしれません。 出力がターミナルで、かつ は、その一部をコマンドとして解釈します。

grep はファイルをスキャンし、読めない文字があれば、ファイルがバイナリであると見なします。追加 -a スイッチに grep を使用すると、ファイルを可読なテキストとして扱うことができます。おそらく、入力ファイルには読めない文字が含まれているのでしょう。

<ブロッククオート

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

とはならない。 comm -13 <(...) <(...) より速く、よりシンプルに?