• ベストアンサー

sedで特定の文字列を抜き出す方法

有識者の知恵をお借りしたいのですが、以下のようなエラーログの出力結果が あった場合、AAAAA01が含まれる文字列の括弧の中の部分をsedで抜き出したい 場合はどのような指定をすればよいでしょうか。 括弧の中の文字はランダムで毎回同じとは限らない場合の指定方法をご教示下さい。 AAAAA00 AAAAA01 AAAAA02 AAAAA03 AAAAA04 AAAAA05 AAAAA06 (AAAAA07) BBBBB00 BBBBB01 BBBBB02 BBBBB03 BBBBB4 BBBBB05 BBBBB06 (BBBBB7) CCCCC00 CCCCC01 CCCCC02 CCCCC03 CCCCC4 CCCCC05 CCCCC06 (CCCCC7) 以下のコマンドで問題なく処理されますでしょうか。 sed -n "s/.*AAAAA01.*\((,)*\)\$ よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「AAAAA01が含まれる文字列の括弧の中の部分をsedで抜き出したい」という目的を忠実に実行するなら sed -ne '/AAAAA01/{s/^.*\([^)]*\).*$/\1/; p}' とかかなぁ?

nakasan120
質問者

お礼

Tacosan様 回答をいただきましてありがとうございます。 また、返信が遅くなり申し訳ございません。 現在、コマンドを確認できる環境がないため、確認後に結果をご報告 させていただきます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

Perl で「(かっこのネストがあったら最も内側の) 最初のかっこ内を表示する」ならわざわざ置換しなくても perl -ne 'if (/AAAAA01/) { /\(([^(]*?)\)/; print "$1\n"; }' でいいような気がします>#4. /AAAAA01/ and do { ... } とどっちが速いかは知らない.

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

空白や()のネストありとなると、awkではこんな感じでしょうね。 awk '/AAAAA01/{if (match($0,"[(].*[)]") > 0) print substr($0,RSTART+1,RLENGTH-2)}' < file ついでにperlとsed perl -e 'while(<>){ if(/AAAAA01/){ s#^[^(]*[(](.*)[)][^)]*$#$1#; print $_,"\n"; }}' < file sed -En '/AAAAA01/s#^[^(]*[(](.*)[)][^)]*$#\1#p' file

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ああそうだ, #2 では「AAAAA01 が含まれる行には必ずかっこが存在する」とか「かっこでくくられた中にはかっこが存在しない (ものが存在する)」とか, いくつか前提条件があるので注意してくださいね.

  • mendokusa
  • ベストアンサー率13% (359/2726)
回答No.1

sedでないとダメですか? awkだと簡潔に書けるんですが。 awk '/AAAAA01/{print $8}' ログファイル 括弧付で出るのであとは好きなようにしてください。

nakasan120
質問者

お礼

mendokusa様 回答をいただきましてありがとうございます。 また、返信が遅くなり申し訳ございません。 awkは考えておりませんでした。 質問には書いておりませんでしたが、括弧の中の文字列は空白で 区切られた文字列が出力される場合もあり、文字数もランダムな ものが出力されます。 説明が足らず申し訳ありません。

関連するQ&A