UNIX .gz 파일의 내용 인쇄

UNIX .gz 파일의 내용 인쇄

다음 내용이 포함된 .gz 파일이 있습니다.

ID:123455   23-07-2015 mvni
warning: RTM post
warning : no profile data

no profile data문자열을 사용하여 ID를 인쇄 하고 싶습니다 . 줄 전후에 grep을 사용해 보았지만 작동하지 않습니다. 다른 방법을 제안해주세요.

답변1

$ zgrep -B2 'warning : no profile data' *.gz | grep -o '^ID:[0-9]*'
ID:123455

user3188445가 지적했듯이 zgrepgrep은 (아마도 압축된) 파일에서 문자열을 찾습니다. 경고 일치 전에 2줄을 인쇄하는 데 사용되며, -B2일치하는 모든 파일의 ID를 추출하기 위해 표준을 사용합니다.grepstdout

이는 압축 파일이 여러 개 있거나 동일한 파일 내에 일치하는 섹션이 여러 개 있는지 여부에 관계없이 적용됩니다.

답변2

zcat또는 명령은 gzip -dcgzip 압축 파일의 출력을 압축 해제하여 stdout으로 인쇄합니다. 예를 들어 를 실행할 수 있습니다 . 그러나 대부분의 시스템에는 이미 이 작업을 수행하는 zcat file.gz | grep '^ID:'명령이 있습니다 .zgrep

고쳐 쓰다

이와 같은 파일이 여러 개 있고 파일에서 특정 경고가 포함된 ID 줄을 인쇄하고 싶다면 다음을 수행하면 됩니다.

zgrep -l 'warning : no profile data' *.gz | xargs zgrep '^ID:'

첫 번째 명령은 zgrep -l경고가 포함된 파일 목록을 인쇄합니다. 두 번째 명령은 xargs표준 입력의 인수 목록을 승인하고 모든 입력에 대해 명령을 실행합니다. zgrep원하는 ID 줄을 인쇄하도록 실행되는 명령도 마찬가지입니다 .

두 번째 업데이트

숫자 ID만 추출하려면 앞서 제안한 명령을 받아 추가하세요.

| sed -e 's/^ID:\([0-9]*\) .*/\1/'

그러면 ID 번호만 인쇄됩니다.

답변3

zgrep을 사용하여 .gz 파일을 grep할 수 있습니다. 나는 당신이 다음과 같은 것을 원하는 것으로 생각합니다.

zgrep -B 2 'warning : no profile data' file.gz

답변4

GNU 유틸리티에 액세스할 수 있는 경우 다음과 같이 작동합니다.

zgrep -B2 "no profile data" file | grep -oP 'ID:\K\d+'

그래도 문제가 해결되지 않으면 다음을 시도해 보세요.

zcat file.gz | grep -B2 "no profile data" | sed -n 's/ID:\([0-9]*\).*/\1/p'

또는:

zcat file.gz | 
 awk '{if(/^ID/){split($1,a,/:/); id=a[2];}if(/no profile data/){print id}}'

또는:

 zcat file.gz | perl -lne '$id=$1 if /^ID:(\d+)/; print $id if /no profile data/'

관련 정보