kstで使用するためのLinuxログファイル構造の変更

kstで使用するためのLinuxログファイル構造の変更

私のファイル(ネットワークセンサーのTCPダンプ)の外観は次のとおりです。

20:06:57.049686 IP(tos 0x0, ttl 64, id 26871, オフセット 0, フラグ [DF], 生 UDP(17), 長さ 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 長さ 40
    0x0000: 4500 0044 68f7 4000 4011 25c7 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 1e8b 3132 3033 ...$.....0..1203
    0x0020:3132 2e37 3836 3036 2c20 332c 2020 2030 12.78606,.3,...0
    0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153,.-0.153,..9
    0x0040: 2e39 3630 .960
20:06:57.113591 IP(tos 0x0, ttl 64, id 26872, オフセット 0, フラグ [DF], 生 UDP(17), 長さ 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 長さ 40
    0x0000: 4500 0044 68f8 4000 4011 25c6 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 148f 3132 3033 ...$.....0..1203
    0x0020: 3132 2e38 3336 3131 2c20 332c 2020 2d30 12.83611,.3,..-0
    0x0030: 2e31 3533 2c20 2d30 2e34 3630 2c20 2039 .153,.-0.460,..9
    0x0040: 2e39 3630 .960
20:06:57.188105 IP(tos 0x0, ttl 64, id 26873, オフセット 0, フラグ [DF], 生 UDP(17), 長さ 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 長さ 40
    0x0000: 4500 0044 68f9 4000 4011 25c5 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 1b80 3132 3033 ...$.....0..1203
    0x0020: 3132 2e38 3836 3135 2c20 332c 2020 2d30 12.88615,.3,..-0
    0x0030: 2e31 3533 2c20 2d30 2e33 3036 2c20 2039 .153,.-0.306,..9
    0x0040: 2e38 3037 .807                                 
20:06:57.200719 IP(tos 0x0, ttl 64, id 26874, オフセット 0, フラグ [DF], 生 UDP(17), 長さ 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 長さ 40
    0x0000: 4500 0044 68fa 4000 4011 25c4 8083 d0bf E..Dh.@.@.%.....
    0x0010:8083 da24 85b1 15b3 0030 2884 3132 3033 ...$.....0(.1203
    0x0020: 3132 2e39 3336 3135 2c20 332c 2020 2030 12.93615,.3,...0
    0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153,.-0.153,..9
    0x0040: 2e38 3037 .807

次のようなまたは類似した形状に変換する必要があります。

20:06:57.049686 26871, 120312.78606,.0.153,.-0.153,..9.960
20:06:57.113591 26872, 120312.83611,-0.153,.-0.460,..9.960
20:06:57.188105 26873, 120312.88615,-0.153,.-0.306,..9.807
20:06:57.200719 26874, 120312.93615,.0.000,.-0.153,..9.807

これまで、vbスクリプトは素晴らしいタスクを実行していますが、今回はこのデータをリアルタイムで表示する必要があります。 。完了しました。 libre-office で vbscript を使用することはもう良くありません。

どんな提案がありますか?

ベストアンサー1

私は私のアプローチを考え直し、H既存のスペースを使用する方が簡単で強力であると判断しました。ファイルがスペースの代わりにタブで区切られていると述べたように、単純な修正はリテラルスペースの代わりに文字クラスを使用することです。しかし、クラスの場合、少しかさばる傾向があるため、一般的にクラスを使用するときに代替品として梱包することを好みます。また、これをシェル関数でラップし、簡単なコマンドでラップします。

ここに別の点があります。

#!/bin/sh
robot() (s=[:blank:];LC_ALL=C \
    sed "s/^[$s].*[$s]//;s/\.\.*/./g
    /[$s][^i$]*[^1-9d]*[d$s]*/!{H;\$!d
    };   s//,/;x;s///;s/\n//g
         s/,\.\([-1-9]*\)0*//
         s//,\1/g;s//,+.\1/g" "$@" 
)
robot "$@"            

sed一番上の行と一番下の行を削除すると、POSIX準拠のエントリを含む実行中のPOSIX準拠のシェルにコピー/貼り付けることができます。$PATHそれ以外の場合は、上記の内容をそのまま作成できます$PATH。 。良い:INPUT| robotrobot <infilerobot infile1 infile[2-9] -

robot <<\DATA
20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, length 40
    0x0000:  4500 0044 68f7 4000 4011 25c7 8083 d0bf  E..Dh.@.@.%.....
    0x0010:  8083 da24 85b1 15b3 0030 1e8b 3132 3033  ...$.....0..1203
    0x0020:  3132 2e37 3836 3036 2c20 332c 2020 2030  12.78606,.3,...0
    0x0030:  2e31 3533 2c20 2d30 2e31 3533 2c20 2039  .153,.-0.153,..9
    0x0040:  2e39 3630                                .960
DATA

そして古いバージョンが印刷されます...

20:06:57.049686,26871,.0.120312.78606,.3,.0.153,-0.153,.9.960

この印刷...

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

今先頭を削除します指すまたは0 ゼロ.3出力に含まれていないさまざまなフィールドから以前に取得した偽のフィールドを削除します。また、+次から始まるフィールドの出力にシンボルを追加します。- スプリント

たぶん、あまりにも多くのことをしているのかもしれません。正直言って、このすべての領域がどのように調和するのかわかりません。それは最善の推測です。以下で詳しく説明しようとしましたが、何らかの理由で他の作業を見たい場合は、お気軽にお問い合わせください。

文字クラスは[:blank:]ロケールで定義された水平スペース文字と一致するため、スペースやタブにすることができ、違いはありません。ロケールを考慮して、Cここでロケールを明示的に指定することにしました。テキスト処理を実行するときは常に最も賢明な方法だからです。Cロケールでは、各入力バイトが単一文字に一致することが保証されます。sed(これを行うとき、これは多くの意味を持つことができます.*。ただし、関数で定義されているすべての状態はその関数に対してのみローカルであり、印刷以外の実行環境には影響しませんstdout

フロー:

スクリプトの最初の行からsed最初から最後までの文字シーケンスが削除されます。[[:blank:]] もし行は1から始まります。次に、.dot一連のsを単一sに置き換えます.dot

次の行は少し毛があります。これはs///、スクリプトが最後のnull以外のアドレスを参照するためにnullアドレスを使用してマルチレベル置換を処理するために使用される単一のアドレスです。

/[$s][^i$]*[^d1-9]*[d$s]*/

ただ確かに住所一致に 1 つ以上のスペースが含まれています。一致の他のすべてのシーケンス0個*以上発生- したがって、スペースがまったく含まれていない行と一致することはできません。これは、1で始まるすべての行からすべてのスペースを削除したため、ブロックヘッダーにのみ一致することを意味します。

だから私が最初にしたことは、ヘッダー以外の行と比較し、一致しない場合は前のスペースにH配置し、出力から最後の非行を削除することです。したがって、ここの最後の行は、スクリプトの残りの部分のすべてのブロックヘッダーと一緒に1つにまとめられます。なぜなら、ここからはルールが適用される唯一の削減だからです。!$!d!$$sed

そのアドレスをヘッダー行と比較します。

20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
  • [$s]- 最初のスペースと一致しますIP
  • [^i$]*- マッチ64,[[:blank:]]
  • [^d1-9]* - matches the 私`。
  • [d$s]*- 一致d[[:blank:]]

したがって、これを行うと、s//,/これらすべてがコンマに置き換えられます。これは先行と一致することができないため、私たちが通過した最後の行には影響しません[[:blank:]]。下痢であっても、最後の行に対して印刷された唯一のコピーは以前にH私たちを待っていたものなので、何の変更も重要ではありません。スペースを変更した後に対処してくださいx。これは次のコマンドです - そしてそれは普遍的に適用されます - だから私たちは今次のパターンスペースを使用しています...

20:06:57.049686,26871, offset 0, flags [DF], proto UDP (17), length 6\
8)\n40\nE.Dh.@.@.%.\n.$.0.1203\n12.78606,.3,.0\n.153,.-0.153,.9\n.960$

...これは、H前のブロックヘッダーとそれ以降のすべての行に適用された編集内容を表します。ご覧のとおり、\nそこにあるewlineエスケープ文字で区切られています。

これを長いアドレスと比較しましょう。

  • [$s][[:blank:]]- 直前の最初の項目と一致しますoffset
  • [^i$]*- 常に一致しますが、最初の$文字の発生は含まれません。
  • [^d1-9]*- 一致します.0.
  • [d$s]*- まったく一致しません。

だから、以前のようにs///すべて消去してください。すべての\newlinesを削除した後、s/\n//gパターンスペースは次のようになります。

20:06:57.049686,26871,120312.78606,.3,.0.153,.-0.153,.9.960

...以前のバージョンではほとんどそのまま残っています。しかし、再帰的一致に興味があり、いくつか追加しました。これをしてはいけません。バグが見つかったので、もっとうまくいくかもしれませんが、最後の部分は、2番目のフィルタのcsv用の新しいスクリプトを使用するとうまくいくでしょう。それでも、例の入力には確実に機能し、おそらくより多くの入力に機能します。しかし、適用されていないか、適用されますが期待に満たない場合は拒否すると思いました。上記のように、最後の2行を簡単に削除して、この回答を確認したときに許可されたものと一致する出力を取得できます。

s/,\.\([-1-9]*\)0*//

これにより、シーケンスの最初の項目が削除されます。、スポットそれから。指す、0個以上- スプリントまたは、ゼロ以外の数字に次のゼロを加えた値です。これにより、,.3出力から該当するフィールドが削除されます。

グローバルフラグを使用して2番目に適用し、次のように削除せずにg保存します。\1s//,\1/

20:06:57.049686,26871,120312.78606,.0.153,.-0.153,.9.960

...入力する...

20:06:57.049686,26871,120312.78606,.153,-.153,9.960

もう一度gグローバルに適用し、次のような+.ものを追加すると、s//,+./g読み取るパターンスペースがさらに修正されます。

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

...これは、次のラインサイクルが始まるstdout前に自動的に印刷されます。sed

実際にここまで試した読者がいて、以前のバージョンが何を意味するのか疑問に思っている場合は、編集履歴にそのバージョンとその動作方法の詳細な説明を見つけることができます。

このスクリプトを入力すると、完全な入力例は次のようになります。

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960
20:06:57.113591,26872,120312.83611,-.153,-.460,9.960
20:06:57.188105,26873,120312.88615,-.153,-.306,9.807
20:06:57.200719,26874,120312.93615,+.153,-.153,9.807

おすすめ記事