다음 내용이 포함된 .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가 지적했듯이 zgrep
grep은 (아마도 압축된) 파일에서 문자열을 찾습니다. 경고 일치 전에 2줄을 인쇄하는 데 사용되며, -B2
일치하는 모든 파일의 ID를 추출하기 위해 표준을 사용합니다.grep
stdout
이는 압축 파일이 여러 개 있거나 동일한 파일 내에 일치하는 섹션이 여러 개 있는지 여부에 관계없이 적용됩니다.
답변2
zcat
또는 명령은 gzip -dc
gzip 압축 파일의 출력을 압축 해제하여 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/'