Linuxログファイル構造の変更、異常な(?)sed動作

Linuxログファイル構造の変更、異常な(?)sed動作

わかりました、だからこれを手に入れようとしています。

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

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

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                                 

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

到着

E..Dh.@.@.%.....
  ...$.....0..1203
  12.78606,.3,...0
.153,.-0.153,..9
.960

など、

このコマンドを使用してください

sed -u -e 's_0x0000:  4500 0044 68f7 4000 4011 25c7 8083 d0bf  __g;s_0x0010:  8083 da24 85b1 15b3 0030 1e8b 3132 3033__g;s_0x0030:  2e31 3533 2c20 2d30 2e34 3630 2c20 2039__g;s_0x0020:  3132 2e37 3836 3036 2c20 332c 2020 2030__g;s_0x0040:  2e39 3630__g' <tcpdump_log_sample_capture2.txt >out2

わかりました。

E..Dh.@.@.%.....
  ...$.....0..1203
  12.78606,.3,...0
0x0030:  2e31 3533 2c20 2d30 2e31 3533 2c20 2039  .153,.-0.153,..9
                                .960

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
  .153,.-0.460,..9
                                .960

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                                 

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

したがって、最初の5行のうち0x0030で始まる4行目を除くすべての行で機能します。

2番目のセットでは最後の2行には機能しますが、最初の3行には機能せず、3番目と4番目のセットでは機能しません!

誰かが一度見て、何が起こっているのか教えてもらえますか? gオプションを使用すると、再帰的でなければなりません!

(私はsed(GNU sed)4.2.2を受け取りました)

答え1

固定幅フィールドでGNU Sedを使用する

出力は固定幅フィールドにフォーマットされているように見えるため、必要なデータを取得するには、各行から最初の50文字を削除するだけです。たとえば、

sed -r 's/^.{50}//' /tmp/corpus

答え2

列にデータを含むテキストファイルを表示するたびに、次の点を考慮してくださいawk。これは簡単ですawk

$ awk '{print $NF}' file 
E..Dh.@.@.%.....
...$.....0..1203
12.78606,.3,...0
.153,.-0.153,..9
.960

E..Dh.@.@.%.....
...$.....0..1203
12.83611,.3,..-0
.153,.-0.460,..9
.960

E..Dh.@.@.%.....
...$.....0..1203
12.88615,.3,..-0
.153,.-0.306,..9
.807

E..Dh.@.@.%.....
...$.....0(.1203
12.93615,.3,...0
.153,.-0.153,..9
.807

特殊変数はNF現在の行のフィールド数です。したがって、$NF行の最後のフィールドです。スクリプトawkはファイルの各行を調べ、最後のフィールドを印刷します。

perl必要に応じて、次のようにすることもできます。

perl -lane 'print $F[$#F]' file

あるいは、GNU grepを使用することもできます。

grep -oP '.+\s\s*\K[^\s]+' file1

またはsed何らかの理由で本当にメソッドが必要な場合は、GNU sed(または拡張正規表現を受け入れる他のバージョン)を使用して、次のようにします。

 sed -r 's/.* +([^ ]+) *$/\1/' file

上記のコマンドは、.* +1つ以上の空白()で終わる最も長い文字列を探し、空白ではなく最長の文字列([^ ]+)を探し、0個以上の空白( *)を探し、文字列全体をキャプチャされたパターンに置き換えます(これは括弧の目的です) )。 )。それでもファイルにスペースがない場合は失敗します。 awkは最高のツールです。

答え3

使用しないでくださいsed -u。思ったように動作しません。すべてのバッファリングはスピードアップsedにのみ貢献するので、あなたに有利に作用します。これは、非常に特定のポイントから入力を受け取り、そのポイントの後に入力を消費したくない場合にのみ本当に便利です。sedsed -uqsed

たとえば、

printf %s\\n line1 line2 | {
    sed -u =\;1q
    sed =
}

...印刷...

1
line1
1
line2

...しかし、-uそのフラグを使用しない場合は印刷されます...

1
line1

...最初は、各呼び出しでバッファを埋め、sed2番目がそれを見る機会がある前にバッファ全体をread()消費するためです。適切な長さの入力が与えられると、1行に1回実行する必要があるため、処理速度がかなり遅くなります。|pipesedsed -usedread()

しかし、これはあなたの問題ではありません。

あなたの問題は、あなたが一生懸命働いているということです。する:

sed 's/.* //' <infile >outfile

これにより、最後のスペースまで含む行のすべての内容が削除されます。これにより、目的の結果が得られます。

@CodeGnome そうなんですね。これは信頼できるアプローチではありません。表示されるデータには効果がありますが、より安定した別のアプローチは次のとおりです。

sed 's/   */\n/2;s/.*\n//'

これは、2 つ以上の連続した空白が 2 番目に現れることを改行\n文字に置き換え、その前のすべてを削除します。\nパターン空間からewline文字を取得する唯一の方法は、sedそこに置くことです。

答え4

あなたはこれをしなければなりません:

paste  -d ""  <( awk {'print $10'}  yourfile )  <( cut -b 51 yourfile ) <( cut -b 52 yourfile ) <( cut -b 53 yourfile )  <( cut -b 54 yourfile )

出力は次のとおりです

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.78606,.3,...012.7
.153,.-0.153,..9.153
.960

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.83611,.3,..-012.8
.153,.-0.460,..9.153
.960

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.88615,.3,..-012.8
.153,.-0.306,..9.153
.807

E..Dh.@.@.%.....E..D
...$.....0(.1203...$
12.93615,.3,...012.9
.153,.-0.153,..9.153
.807

関連情報