1

ログファイルにサンプルデータがあります

ノード ID> コマンド 1

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

ノード ID> コマンド 2

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

NODE-ID> command3

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

順次コマンドによって生成されるファイルがあります。ログファイルからデータを抽出する方法がわかりません

ファイルからデータを抽出する必要があるとします

ノード ID> コマンド 1

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

そうするための最良の方法は何ですか?ほとんどのスクリプトはシェル スクリプトで記述されています。awk または sed を使用できます。提案してください

4

4 に答える 4

4
perl -ne 'sub BEGIN { $/="NODE-ID> "; } { if (/^command1/) { s:$/$::; print "$/$_"; }}'

sed/awk ではありませんが...動作します。

これおかしいです:

awk 'BEGIN { RS="NODE-ID> "; } /^command1/ { print RS $0; }'

CodeGnome に触発されて、sed オプションを追加します。

sed -n '/^NODE-ID> command1/,/^NODE-ID> / { /^NODE-ID> command1/ { p; d; }; /^NODE-ID> /q; p }'
于 2012-07-21T15:51:15.907 に答える
1

Sed ソリューション

sedでこれを行うことは確かに可能です。たとえば、次のコマンドは次の出力を返します。

$ sed -n '/command1/,/command2/ { /command2/q; p }' /tmp/foo

ノード ID> コマンド 1

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

于 2012-07-21T16:15:11.647 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/NODE-ID> command1/!d;n;n;:a;/./!Q;n;ba' file

また:

sed '/NODE-ID> command1/!d;n;n;q' file

コマンドが1行のテキストのみで構成されている場合(例のように)。

于 2012-07-22T07:03:34.987 に答える
0

サンプル データの文字列 "consequat" など、レコードの最後の行に一意のものがあった場合、次の単純な awkコマンドが機能します。

awk '/command2/,/consequat/ {print $0}' data.txt

または、レコードの長さが同じになる場合は、次のようにします。

awk '/command2/{st=NR;for(i=st;i<=st+6;i++){print $0;getline}}' data.txt

この例では、で始まるブロックを抽出しcommand2、次の 6 行を取得します (これは、提供されたサンプル データ セット/形式で動作します)。

于 2012-07-21T16:07:45.150 に答える