md5sum 出力を grep にパイプしますが、grep は一致しない項目を削除するのではなく、一致を強調表示します。

md5sum 出力を grep にパイプしますが、grep は一致しない項目を削除するのではなく、一致を強調表示します。

以下から複数のファイルをダウンロードしました。買い戻しより多くのファイルがあります。各ファイルのmd5sum情報は、.md5sumという単一のファイルに保存されますMD5SUMS

ファイルの整合性を確認するために、md5sum -c MD5SUMSファイル内のすべてのファイルに対して長い出力を生成しましたMD5SUMS。ファイルが見つからない場合(ダウンロードしない)、文句を言い、ファイルが見つかり、md5sum情報が一致した場合は「ok」と言いました。

md5sum: gencode.v27.tRNAs.gtf.gz: No such file or directory
gencode.v27.tRNAs.gtf.gz: FAILED open or read
md5sum: GRCh38.p10.genome.fa.gz: No such file or directory
GRCh38.p10.genome.fa.gz: FAILED open or read
GRCh38.primary_assembly.genome.fa.gz: OK
md5sum: _README.TXT: No such file or directory
_README.TXT: FAILED open or read

grep「異常な」行をフィルタリングするためにパイプで接続しましたが、それでも出力全体を得ますmd5sum -c MD5SUMS | grep OK。非常に長い出力を得る。存在しないファイルの場合は、「該当するファイルまたはディレクトリなし」のある行と「正常」のある行です。 「md5sum 構文に一致するファイルは赤で強調表示されます。

md5sum: gencode.v27.polyAs.gff3.gz: No such file or directory
md5sum: gencode.v27.polyAs.gtf.gz: No such file or directory
gencode.v27.primary_assembly.annotation.gff3.gz: OK
md5sum: gencode.v27.transcripts.fa.gz: No such file or directory
md5sum: gencode.v27.primary_assembly.annotation.gtf.gz: OK

ただし、中間ファイルを使用して出力を保存し、md5sumそのgrepファイルを保存すると、期待どおりに「OK」というフレーズを含む行が表示されます。

md5sum -c MD5SUMS > test
grep "OK" test

gencode.v27.primary_assembly.annotation.gff3.gz: OK
gencode.v27.primary_assembly.annotation.gtf.gz: OK
GRCh38.primary_assembly.genome.fa.gz: OK

問題を理解できません。パイプラインで何が問題なのか、それとも予想される動作かを把握するのに役立ちますか?

ベストアンサー1

md5sum欠落しているファイルによって生成されたエラーメッセージが表示されます。これらのメッセージは常に標準エラーストリームであるため、標準エラーストリームから生成されます。出力ストリームはパイプを介して渡され、エラーメッセージはgrepコマンドの影響を受けません。

まったく表示されないようにリダイレクトするには、次のようにします。

md5sum -c MD5SUMS 2>/dev/null | grep OK

エラーをログファイルに保存するには(たとえば、後で見つからないファイルを確認するために)、エラーを記録したい/dev/nullファイル名に置き換えます。


ビットの説明2>/dev/null

コマンドは、2つの別々のストリームの出力を生成します。標準出力ストリームそして標準エラーストリーム。常に「ファイル記述子」1と2に割り当てられます。

標準出力ストリームは、コマンドの「標準出力」が移動する場所で、例のように他のコマンドにパイプすることができますgrep

標準エラーストリームは、「診断メッセージ」(通常「エラー」を意味します)がある場所です。いいえ通常、端末に直接別のコマンドをパイプします。これが、grepコマンドがエラーメッセージをフィルタリングできないように見える理由です。実際にエラーメッセージを見ることもできません。

2>生成されたすべての項目が端末に到達しないように、標準エラーストリームを別の場所にリダイレクトします。

標準出力ストリームをリダイレクトするのと同じものであり1>、縮小して使用できます>

この/dev/nullファイルは特別です。そこに書かれたすべては完全に消えます。

コマンドの後に使用すると、すべてのエラーメッセージが端末の代わりにリダイレクトされ2>/dev/null削除されることを意味します。/dev/null

おすすめ記事