我有以下输出文件,需要在单行上的多行大括号之间打印字符串。
输入 :
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)