전체 파일의 압축을 풀지 않고 .gz 압축 파일의 첫 번째 줄을 읽습니다.

전체 파일의 압축을 풀지 않고 .gz 압축 파일의 첫 번째 줄을 읽습니다.

.gz 형식으로 압축된 대용량 로그 파일이 있는데 압축을 풀지 않고 파일의 첫 번째 줄을 읽고 파일에서 가장 오래된 로그의 날짜만 확인하고 싶습니다.

로그 형식은 다음과 같습니다.

YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng

첫 번째 줄의 날짜만 읽고 싶습니다. 압축되지 않은 파일의 경우 다음과 같이 합니다.

read logdate otherstuff < logfile.gz
echo $logdate

zcat을 사용하면 시간이 너무 오래 걸립니다.

답변1

Piping zcat의 출력은 head -n 1첫 번째 줄을 표시하기에 충분하도록 보장되는 소량의 데이터 압축을 풀지만 일반적으로 가득 찬 버퍼 수는 몇 개(내 실험에서는 96KiB)를 넘지 않습니다.

zcat logfile.gz | head -n 1

head한 줄을 읽고 나면 입력을 닫아 파이프를 닫고 zcata를 받은 후 중지합니다 SIGPIPE(이는 다음에 닫힌 파이프에 쓰려고 할 때 발생합니다). 이것을 실행하면 볼 수 있습니다

(zcat logfile.gz; echo $? >&2) | head -n 1

(13 + 128)로 인해 중지되었음을 zcat나타내는 코드 141로 종료 됩니다 .SIGPIPE

후처리를 더 추가할 수 있습니다.예를 들어AWK를 사용하여 날짜만 추출합니다.

zcat logfile.gz | awk '{ print $1; exit }'

gzcat(macOS에서는 처리하는 대신 zcatgzip 압축을 사용할 수도 있습니다 .)

답변2

zcat(or)에 제공되는 데이터의 양을 제한한 gzip -dc다음 첫 번째 행을 요청할 수 있습니다.

head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff

1000첫 번째 행 전체를 가져오기에 충분한 데이터가 캡처되지 않으면 조정하세요.

답변3

zip 파일의 첫 번째 줄 날짜만 일치시킵니다. zgrep해결 방법:

zgrep -m1 -o '^[^[:space:]]*' logfile.gz

YYYY-MM-DD그러면 첫 번째 결과가 출력됩니다.

답변4

파일 압축을 풀지 않고 첫 번째 줄만 원하는 경우:

gunzip -c logfile.gz | awk 'NR==1 {print; exit}'

이렇게 하면 압축된 데이터를 압축 해제하지 않고 표준 출력으로 보내고 awk첫 번째 줄만 인쇄합니다.

관련 정보