
저는 zgrep
tarball 파일에서 문자열을 검색하는 데 사용합니다. 일반적인 방법으로 수행하면 다음과 같은 결과를 얻습니다.
aaa.tar.gz 내의 zgrep
Binary file (standard input) matches
그래서 해당 옵션을 사용했고 -a
(바이너리 파일을 텍스트처럼 처리) 파일을 읽었지만 결과 앞에 2/3개의 성가신 줄을 추가했습니다!
aaa.tar.gz의 zgrep -a
aaa.txt 0000777 0000000 0000000 00000000017 13507572577 011066 0 ustar root
root
insideinsidebbb
어떻게 효과적으로 제거할 수 있나요?
답변1
GNU를 사용하면 tar
이 --to-command
옵션을 사용하여 각 아카이브 멤버를 로 파이프할 수 grep
있으므로 (GNU grep
및 해당 --label
옵션을 사용하여) 일치 항목이 포함된 포함된 파일의 이름도 얻을 수 있습니다.
$ tar --to-command='grep -aH --label="$TAR_ARCHIVE[$TAR_FILENAME]" inside || true' -xf awk.tar.gz
awk.tar.gz[ytab.c]: SYNTAX("next is illegal inside a function");
awk.tar.gz[ytab.c]: SYNTAX("nextfile is illegal inside a function");
awk.tar.gz[awkgram.y]: SYNTAX("next is illegal inside a function");
awk.tar.gz[awkgram.y]: SYNTAX("nextfile is illegal inside a function");
awk.tar.gz[lex.c]:/* BUG: this ought to be inside the if; in theory could fault (daniel barrett) */
awk.tar.gz[ytabc.bak]: SYNTAX("next is illegal inside a function");
awk.tar.gz[ytabc.bak]: SYNTAX("nextfile is illegal inside a function");
이는 || true
아카이브 구성원에서 어떤 항목도 발견되지 않는 tar: 2631: Child returned status 1
경우 경고를 방지하기 위한 것입니다.grep
targrep
다음과 같은 도우미 함수나 스크립트를 작성할 수 있습니다 .
#! /bin/sh -
export PATTERN="${1?}"
shift
for file do
tar --to-command='
grep -aPH --label="$TAR_ARCHIVE[$TAR_FILENAME]" -e "$PATTERN" || true
' -xf "$file"
done
다음과 같이 사용됩니다:
targrep inside *.tar.*
이는 GNU에서 지원하는 가장 완전한 기능을 갖춘 정규식인 PCRE를 사용하므로 tar
대소문자를 구분하지 않는 일치를 수행할 수 있습니다. 예를 들면 다음과 같습니다.
targrep '(?i)inside' *.tar.*
(옵션을 지원하기 위해 스크립트에서 더 복잡한 옵션 구문 분석을 피함 -i
)
답변2
당신이 얻는 쓰레기는 TAR 헤더입니다. 왜냐하면 당신의 tarball은 TAR 아카이브로 싸여진 다음 GZIP을 사용하여 압축된 파일이기 때문입니다.
압축된 패키지를 grep하는 가장 좋은 방법은 다음과 같습니다.
tar -xzOf aaa.tar.gz | grep inside
x
: 세련됨z
: 아카이브에서는 GZIP 압축을 사용합니다.O
: stdout으로 출력 (GNUtar
또는 libarchive 가정bsdtar
)f
: 추출할 아카이브
tar의 출력은 이미 일반 텍스트이므로(텍스트 파일만 포함한다고 가정) grep에 "-a" 옵션이 필요하지 않습니다.
답변3
한 가지 방법은 greping 전에 NUL 문자(일반적으로 바이너리 파일의 문자열을 구분함)를 개행 문자로 변환하는 것입니다. 이는 tar
귀하의 경우에는 작동하지만 다른 형태의 바이너리에서도 작동할 수 있습니다.
file=xxx.tar.gz
zcat -f < "$file" | tr '\0' '\n' | grep -a inside