압축된 텍스트 파일의 마지막 몇 줄을 압축 해제하고 인쇄하는 방법은 무엇입니까?

압축된 텍스트 파일의 마지막 몇 줄을 압축 해제하고 인쇄하는 방법은 무엇입니까?

6개의 gzip 압축 텍스트 파일이 있는데 각 파일의 압축 크기는 약 17G입니다. 특정 문제가 있는지 확인하려면 각 파일(압축 해제)의 마지막 몇 줄을 살펴봐야 합니다. 명백한 방법은 매우 느립니다.

for i in *; do zcat "$i" | tail -n3; done

나는 다음과 같은 영리한 일을 할 수 있다고 생각했습니다.

for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done

또는

for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done

그러나 둘 다 다음과 같이 불평했습니다.

gzip: stdin: not in gzip format

헤더가 없어서 그런 줄 알았는데 gzip이것도 실패했습니다.

$ aa=$(head -c 300 file.gz)
$ bb=$(tail -c 300 file.gz)
$ printf '%s%s' "$aa" "$bb" | gunzip
gzip: stdin: unexpected end of file

내가 정말로 찾고 있는 것은 ztail또는 ztac그러나 나는 그것이 존재하지 않는다고 생각합니다. 전체 파일의 압축을 풀지 않고도 압축 파일의 마지막 몇 줄을 압축 해제하고 인쇄할 수 있는 영리한 트릭을 고안할 수 있는 사람이 있습니까?

답변1

그것 때문에 넌 못해이미 말했다, 파일이 이미 표준을 사용하는 경우 gzip압축을 제어할 수 있는 경우 다음을 사용할 수 있습니다.dictzip파일을 압축하려면 파일을 별도의 청크로 압축합니다. 마지막 청크(보통 64KB)만 압축을 풀 수 있습니다. 그리고 이전 버전과 호환됩니다 gzip. 즉, dictzip 압축 파일도 완벽하게 합법적인 gzip 압축 파일임을 의미합니다.

또 다른 가능성은 여러 개의 gzip 파일을 연결하여 gzip 파일을 얻는 경우 마지막 gzip 서명을 검색하고 그 이후의 모든 내용을 압축 해제할 수 있다는 것입니다.

답변2

훌륭한,당신은 할 수이전에 생성한 경우 gzip 압축 파일에 대한 무작위 액세스색인각 파일마다...

저는 여러분이 찾고 있을 명령줄 도구를 개발했습니다. 이 도구는 gunzip과 동일한 시간 내에 꼬리에 액세스할 수 있지만 작은(<<1%/gzip) 인덱스를 생성하기 때문에다음 추출은 매우 빠릅니다.:

https://github.com/circulosmeos/gztool

이 도구에는 귀하가 관심을 가질 수 있는 두 가지 옵션이 있습니다.

  • -에스옵션은 계속 증가하는 파일을 감시하고 증가함에 따라 이를 인덱싱합니다. 이는 실제로 인덱스를 생성하는 시간을 0으로 단축하므로 gzip으로 압축된 rsyslog 파일에 유용합니다.
  • -티gzip 파일을 추적합니다. 다음을 수행할 수 있습니다. $ gztool -t foo.gz 인덱스가 존재하지 않으면 전체 압축 해제와 동일한 시간이 소요됩니다. 그러나 인덱스를 재사용할 수 있으므로 다음 검색에는 훨씬 더 적은 시간이 소요됩니다. 동시에 사용하고 동시에 인덱스를 생성하는 것은 어떨까요?

이 도구는 다음을 기반으로 합니다.원본 zlib의 zran.c 데모 코드, 그러니 규칙을 따르지 않는 마법은 없습니다!

관련 정보