1行に複数の括弧と複数行の間の文字列を印刷します。

1行に複数の括弧と複数行の間の文字列を印刷します。

次の出力ファイルがあり、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(/!dCLUSQMGR(望ましくない他の行がある場合に備えて、含まれていない行は無視してください。
  • 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)

関連情報