다음 출력 파일이 있는데 한 줄에 여러 줄의 중괄호 사이에 문자열을 인쇄해야 합니다.
입력하다:
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(/!d
CLUSQMGR(
원하지 않는 다른 줄이 있는 경우를 대비하여 포함되지 않은 줄은 무시하세요.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)