한 줄에 여러 대괄호와 여러 줄 사이의 문자열을 인쇄합니다.

한 줄에 여러 대괄호와 여러 줄 사이의 문자열을 인쇄합니다.

다음 출력 파일이 있는데 한 줄에 여러 줄의 중괄호 사이에 문자열을 인쇄해야 합니다.

입력하다:

CLUSQMGR(server1)                      CHANNEL(channel name)
CONNAME(server1.opr.test.company.com(1414))

CLUSQMGR(server2)                      CHANNEL(channel name)
CONNAME(server2.opr.test.company.com(1414))

원하는 출력: CLUSQMGR 뒤의 첫 번째 대괄호에 있는 문자열과 CONNAME 뒤의 첫 번째 대괄호에 있는 문자열이 필요하며, 아래와 같이 한 줄에 공백으로 구분되어 있습니다.

server1 server1.opr.test.company.com(1414)
server2 server2.opr.test.company.com(1414)

나는 시도했다:

awk -F'[()]' '{print $2 $3}'

하지만 이것을 얻으십시오 :

server1                    CHANNEL
server1.opr.test.company.com1414
server2                    CHANNEL
server2.opr.test.company.com1414

답변1

sed귀하에게 적합한 경우 :

sed '/CLUSQMGR(/!d;s///;N;s/).*\n[^(]*(/ /;s/)$//'

설명하다:

  • 주요 아이디어: 두 줄은 쌍으로 제공됩니다. 따라서 쌍의 첫 번째 줄을 찾으면 다음 줄을 읽고 대체하여 필요하지 않은 항목을 제거하세요.
  • /CLUSQMGR(/!dCLUSQMGR(원하지 않는 다른 줄이 있는 경우를 대비하여 포함되지 않은 줄은 무시하세요.
  • s///마지막 패턴을 제거하십시오.CLUSQMGR(
  • N줄 바꿈을 포함하여 패턴 공간에 다음 줄을 추가합니다.
  • s/).*\n[^(]*(/ /닫는 괄호부터 두 번째 줄의 첫 번째 여는 괄호까지 모두 공백으로 바꿉니다. 이는 개행 문자( \n) 에 패턴을 고정 [^(]*하고 다음을 제외한 모든 항목을 일치시켜 수행 됩니다.(
  • s/)$//후행 제거)

답변2

Awk해결책:

awk 'function get_srv_data(sep) {    # get/extract server data
         gsub(/^[^(]+\(|\)$/, "", $1);
         printf $1 sep;
     }
     /^CLUSQMGR/{ get_srv_data(OFS) }
     /^CONNAME/ { get_srv_data(ORS) }' file

산출:

server1 server1.opr.test.company.com(1414)
server2 server2.opr.test.company.com(1414)

관련 정보