linuxでログからawkで抽出するスクリプトに関する質問です。 以前の質問 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12235260042?__ysp=YXdr44Kz44Oe44Oz44OJ
linuxでログからawkで抽出するスクリプトに関する質問です。 以前の質問 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12235260042?__ysp=YXdr44Kz44Oe44Oz44OJ でベストアンサーさせて頂いた件に下記の機能を拡張したいと考えてます 前回のBAの頂いたスクリプト ---- { newNF = 2 for ( i = 3; i <= NF ; i++){ if ( $(i) ~ /^(srcip|srcport)=/ ){ $(++newNF) = $(i) } } NF = newNF print } ----- 〇求めてる結果 上記スクリプトで各行に「msg="xxx yyy zzz" 」の文字列が含まれる場合も取得出来るようにしたい 〇課題 以前だと各フィールドは空白区切りになっており次の空白まで抽出としていたわけですが、このmsgのフィールドに関しては既に内部に空白が入ってしまってます。 以前頂いたスクリプトでは各指定文字列~空白までと指定させて頂きました ただ、この"msg"を条件に付け加える場合 「msg="xxx 」までしか取得できません。 sedでmsgフィールドの空白をアンダバーに変換してからバイプでスクリプトに流す方法も試しましたが上手く行きませんでした。 「sed -e '/^.* msg="t/,/."/s/ /_/g' test.txt」 ※上記コマンドだとtest.txt内の全ての空白が_になってしまいました... 〇備考 可能ならスクリプト内で処理できるようにしたいです それが厳しいならsedでもいいので、方法をご教示ください
Linux系・11閲覧・100
ベストアンサー
お久しぶりです。 とりあえず Perl でやってみました。やりやすそうだったので。 #!/usr/bin/perl -w use strict; { my %colname_h = (); $colname_h{ $_ }++ foreach qw( msg srcip srcport dstip ); while (<>) { my $line; (( $line,$_) = /(\S+\s+\S+)\s+(.*)/ ) || next; while ( /(([^\s=]+)=(?:[^\s"]|"[^"]*")+)/g) { $colname_h{ $2 } && ( $line .= ' ' . $1); } print( $line,"\n"); } } 本当は専用のライブラリを使うべきなんだと思います。Text::CSV とか。 でもそれは後回しにして先に awk でやってみようと思います。
ご回答ありがとうございます またもや初歩的な質問で恐縮ですが 頂いた use strict; 以下の構文については、別のファイルにvi等で書き込み(test.perl的なスクリプトを配置) perl -w test.perl 【処理したいファイル】> 【出力ファイル】 で実行してよいのでしょうか また今回のスクリプトで任意で文字列を編集するところは $colname_h{ $_ }++ foreach qw( msg srcip srcport dstip hoge huga ... ); の部分で良いのでしょうか 現在自主的に調べられる環境でなく初歩的な質問ですが再度ご確認よろしくお願いします
質問者からのお礼コメント
ありがとうございます! perlの方で解決しました! さらにバージョンアップしたので有効活用させて戴きます!
お礼日時:2/26 19:38