次の出力ファイルがあり、1行に複数行の中括弧の間に文字列を印刷する必要があります。
入力する:
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/)$//'
説明する:
- 主なアイデア:2行はペアで提供されています。したがって、ペアの最初の行を見つけたら、次の行を読んで置き換えて、不要な項目を削除してください。
/CLUSQMGR(/!d
CLUSQMGR(
望ましくない他の行がある場合に備えて、含まれていない行は無視してください。s///
最後のパターンを削除します。CLUSQMGR(
N
改行を含むパターン空間に次の行を追加します。s/).*\n[^(]*(/ /
閉じ括弧から2行目の最初の開き括弧まで、すべて空白に置き換えます。これは、改行文字(\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)