파일에 저장된 출력의 예:
Provides: Red Hat Satellite
Red Hat Developer Toolset (for RHEL Server)
SKU: TGV123
Contract: 59104
Pool ID: abcdxyz12340987
위 출력에서 "Red Hat Satellite"를 찾고 "Pool ID:"가 포함된 행을 찾아 풀 ID 값(abcdxyz12340987)을 가져오려고 합니다.
sed, awk 또는 grep을 사용하여 이 정보를 어떻게 얻을 수 있나요? "풀 ID"는 "Red Hat Satellite" 뒤에 여러 줄로 나타날 수 있습니다. 즉, 두 줄 사이에 고정된 줄 수가 없습니다.
도움을 주셔서 감사합니다!
답변1
sed -n '/Red Hat Satellite/,/Pool ID:/{ s/.*Pool ID:[[:blank:]]*\(.*\)/\1/p; }' file
그러면 이후에 문자열을 선택하는 교체가 적용됩니다 Pool ID:
. 문자열을 포함하는 줄 과 문자열을 포함하는 첫 번째 줄 Red Hat Satellite
사이의 모든 줄에서 이 작업을 수행합니다 Pool ID:
. 이 명령은 성공적인 대체 결과만 인쇄합니다.
awk
줄 끝의 문자열 Pool ID:
에 공백이 없으면 다음 명령은 동일한 작업을 수행합니다.
awk '/Red Hat Satellite/,/Pool ID:/ { if (/Pool ID:/) print $NF }' file
grep
컨텍스트 처리("다른 행이 일치하는 경우 행 추출")가 좋지 않기 때문에 작업을 위한 도구가 아닙니다. Null 종료 라인에서 PCRE를 수행하기 위해 GNU를 사용한다면 grep
작동할 수도 있지만 해킹이 될 것입니다.
답변2
그리고awk
스크립팅:
$ awk '/Red Hat Satellite/{ f=1; next }f && /Pool ID:/{ print $NF; exit }' yourfile
abcdxyz12340987