在单行上打印多个括号和多行之间的字符串

在单行上打印多个括号和多行之间的字符串

我有以下输出文件,需要在单行上的多行大括号之间打印字符串。

输入 :

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)

相关内容