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:

명령은 두 개의 별도 스트림에 대한 출력을 생성합니다.표준 출력 스트림그리고표준 오류 스트림. 항상 "파일 설명자" 1과 2에 할당됩니다.

표준 출력 스트림은 명령의 "일반 출력"이 이동하는 곳으로, 예에서와 같이 다른 명령으로 파이프될 수 있습니다 grep.

표준 오류 스트림은 "진단 메시지"(보통 "오류"를 의미함)가 있는 곳입니다.아니요일반적으로 터미널에 직접 다른 명령을 파이프합니다. 이것이 귀하의 grep명령이 오류 메시지를 필터링할 수 없는 것처럼 보이는 이유입니다. 실제로 오류 메시지를 볼 수도 없습니다.

2>생성된 모든 항목이 터미널에 도달하지 않도록 표준 오류 스트림을 다른 곳으로 리디렉션합니다 .

표준 출력 스트림을 리디렉션하는 것과 동일한 것은 이며 1>, 줄여서 로 사용할 수 있습니다 >.

/dev/null파일은 특별합니다. 거기에 쓰여진 모든 것은 완전히 사라질 것입니다.

명령 뒤에 사용하면 모든 오류 메시지가 터미널 대신 2>/dev/null리디렉션되어 삭제된다는 의미입니다 ./dev/null

관련 정보