Text-Processing

Linux 日誌文件結構更改,異常 (?) sed 行為

  • October 24, 2014

好的,所以我試圖得到這個

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

ETC,

用這個命令

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 開始的第四行之外,它在每一行都有效:

在第二組中,它適用於最後兩行,但不適用於前 3 行,對於第 3 和第 4 組,它沒有任何效果!

有人可以看看並告訴我發生了什麼嗎?它應該是使用 g 選項遞歸的!

(我得到了 sed(GNU sed)4.2.2)

使用帶有固定寬度欄位的 GNU Sed

由於您的輸出格式似乎已格式化為固定寬度的欄位,因此您只需從每行中刪除前 50 個字元即可獲得所需的數據。例如:

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

每當您看到列中包含數據的文本文件時,請考慮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是該行的最後一個欄位。這個awkscriptlet 只是遍歷文件的每一行並列印最後一個欄位。

如果您願意,也可以這樣做perl

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

甚至使用 GNU grep:

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

或者,如果您sed出於某種原因確實想要一種方法,請使用 GNU sed(或任何其他接受擴展正則表達式的版本)並且:

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

上面的命令查找以一個或多個空格 ( .* +) 結尾的最長字元串,然後是最長的非空格字元串( ),然後是[^ ]+0 個或多個空格 ( *),並用擷取的模式替換整個內容(這就是括號的作用) . 儘管如此,例如,如果文件具有非空格空格,這將失敗。到目前為止,Awk 是最好的工具。

引用自:https://unix.stackexchange.com/questions/163889