후행 줄을 생성하지 않고 "grep -a"하는 방법은 무엇입니까?

후행 줄을 생성하지 않고 "grep -a"하는 방법은 무엇입니까?

저는 zgreptarball 파일에서 문자열을 검색하는 데 사용합니다. 일반적인 방법으로 수행하면 다음과 같은 결과를 얻습니다.

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으로 출력 (GNU tar또는 libarchive 가정 bsdtar)
  • f: 추출할 아카이브

tar의 출력은 이미 일반 텍스트이므로(텍스트 파일만 포함한다고 가정) grep에 "-a" 옵션이 필요하지 않습니다.

답변3

한 가지 방법은 greping 전에 NUL 문자(일반적으로 바이너리 파일의 문자열을 구분함)를 개행 문자로 변환하는 것입니다. 이는 tar귀하의 경우에는 작동하지만 다른 형태의 바이너리에서도 작동할 수 있습니다.

file=xxx.tar.gz

zcat -f < "$file" | tr '\0' '\n' | grep -a inside

관련 정보