sed, awk 또는 grep을 사용하여 파일에서 일치하는 문자열 다음에 특정 문자열을 찾는 방법

sed, awk 또는 grep을 사용하여 파일에서 일치하는 문자열 다음에 특정 문자열을 찾는 방법

파일에 저장된 출력의 예:

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

관련 정보