설정: Linux GNU bash, 버전 4.3
if grep -c PATTERN $sourcefile
then
grep PATTERN $sourcefile | gzip > compressedfile.gz
fi
소스 파일에 두 번 액세스하지 않아도 되도록 하고 싶습니다.
어떻게 해야 하나요?
답변1
grep 'PATTERN' "$sourcefile" >compressedfile
if [ -s compressedfile ]; then
gzip -f compressedfile
else
rm -f compressedfile
fi
-s
주어진 파일 이름이 존재하고 그것이 참조하는 파일의 크기가 0보다 큰 경우 테스트는 참입니다. 파일이 존재하며(아직 존재하지 않는 경우 리디렉션은 항상 파일을 생성합니다), grep
.
-f
이 플래그는 파일이 커져도 압축을 강제합니다(처음부터 작은 경우 수행됩니다) .gzip
grep
거의 동일하지만(읽기/쓰기 오류가 발생하면 출력을 압축하지 않기 때문에 grep
) 종료 상태를 사용합니다 grep
.
if grep 'PATTERN' "$sourcefile" >compressedfile; then
gzip -f compressedfile
else
rm -f compressedfile
fi
그렇지 않으면
grep 'PATTERN' "$sourcefile" >compressedfile && gzip -f compressedfile
rm -f compressedfile
여기서는 rm
어쨌든 압축되지 않은 파일을 삭제하려고 시도하지만 을 사용하고 있으므로 rm -f
파일이 존재하지 않아도 오류가 보고되지 않습니다( gzip
파일이 압축된 경우 존재하지 않습니다).
grep
가장 일반적인 경우에는 결과를 변수에 저장하지 않는 것이 좋습니다 . 이렇게 하면 기가바이트의 데이터가 반환될 수 있습니다(우리는 이에 대해 알지 못합니다).
답변2
먼저 결과를 grep
변수에 할당할 수 있습니다. 그런 다음 주석에서 @Mark가 제안한 대로 종료 코드를 확인하거나 다음과 같이 결과가 빈 문자열인지 확인할 수 있습니다.
foo=$(grep $PATTERN $sourcefile)
if [ ! -z "$foo" ]
then
echo "$foo" | gzip > compressedfile.gz
fi
또는 문장으로:
foo=$(grep $PATTERN $sourcefile); [ -z "$foo" ] || echo "$foo" | gzip > compressedfile.gz