grep PATTERN 파일, 패턴이 존재하는 경우 gzip, 다른 작업은 수행하지 않음

grep PATTERN 파일, 패턴이 존재하는 경우 gzip, 다른 작업은 수행하지 않음

설정: 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

관련 정보