Text-Processing
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
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
是該行的最後一個欄位。這個awk
scriptlet 只是遍歷文件的每一行並列印最後一個欄位。如果您願意,也可以這樣做
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 是最好的工具。