2012-03-15 186 views
5

下面您將看到從專有路由設備的32b內存轉儲中字符串'octeon'的一小段匹配摘錄。正如你所看到的,它包含一些調整後的ASCII,從行尾延伸到16個字符,然後是四個32位字(當然每個8個字符),然後是地址偏移量。正則表達式僅匹配行尾的X個字符

000b27a0: 41646a75 7374206f 6374656f 6e5f6970 Adjust octeon_ip 
000b2850: 73740a00 00000000 6f637465 6f6e5f72 st......octeon_r 
000b2870: 5f73697a 65000000 6f637465 6f6e5f72 _size...octeon_r 
000b2990: 6164696e 672e0a00 6f637465 6f6e5f72 ading...octeon_r 
000b29b0: 785f7369 7a650000 6f637465 6f6e5f72 x_size..octeon_r 
000b3050: 780a0000 00000000 6f637465 6f6e5f70 x.......octeon_p 
000b3650: 6564204f 6374656f 6e206d6f 64656c0a ed Octeon model. 
000bade0: 20307825 71780a00 6f637465 6f6e5f6c  0x%qx..octeon_l 
000bafd0: 696e6720 4f637465 6f6e2045 78656375 ing Octeon Execu 
000bd710: 6564204f 6374656f 6e204d6f 64656c21 ed Octeon Model! 
000bd950: 4f435445 4f4e2070 61737320 3120646f OCTEON pass 1 do 
000bda20: 6564206f 6374656f 6e206d6f 64656c3a ed octeon model: 

雖然這一數據包含了一些有用的信息,可悲的是,操作系統(HiveOS)沒有試圖連續分配內存或合併不同的堆(爲什麼要?),所以絕大多數的記憶是一個貧瘠的尚未成型的堆。

0004d6b0: 00000000 00000000 00000000 00000000 ................ 
0004d6c0: 00000000 00000000 00000000 00000000 ................ 
0004d6d0: 00000000 00000000 00000000 00000000 ................ 
0004d6e0: 00000000 00000000 00000000 00000000 ................ 
0004d6f0: 00000000 00000000 00000000 00000000 ................ 
0004d700: 00000000 00000000 00000000 00000000 ................ 
0004d710: 00000000 00000000 00000000 00000000 ................ 
0004d720: 00000000 00000000 00000000 00000000 ................ 
0004d730: 00000000 00000000 00000000 00000000 ................ 
0004d740: 00000000 00000000 00000000 00000000 ................ 
0004d750: 00000000 00000000 00000000 00000000 ................ 

我想快速,高效地拔出匹配一些任意的正則表達式模式具有一定規模的字符串([a-zA-z]想到) 你自然會認爲運行常年對象轉儲檢查最喜歡的「弦」會產生一個結果,但md util是一個殘酷的情婦 - 由於存在ascii編碼的十六進制銀行&地址,它將每一行標識爲包含「字符串」。

當然,我們都知道存在一個簡單的腳本解決方案(for line in hexdump: f.write(line[-16:]) + grep '[A-z]' f)。

但是,有時候我會覺得我應該理解這些卑鄙的壓迫,但是更好地理解了正則表達式,而不是回到易於使用的新穎編程語言。我真的覺得我無法開始發展真正的Unix領袖,直到我用各種流編輯器和Awk腳本的正則表達式完全替代了我的整個 開發工具鏈 生活。

如何匹配[a-zA-z]從行尾的一定數量的字符(在我的情況下,16) - 它看起來像一個漂亮精巧的建築,但+,?的所有組合。 {16}以及在過去幾分鐘內對我有意義的事情已經及時地失敗了。

+0

也許我錯誤地理解了這個請求。你想獲得每行的最後16個字符,或*只從最後16個字符中提取字母*? – TLS 2012-03-15 17:40:53

回答

3

使用「不匹配」開關-v

grep -v \.{16}$ 

這將去掉與16點結束的所有行。

這裏的man文檔吧:

-v,--invert匹配
反轉匹配的意義上說,選擇不匹配的行。

3

這是做你想做的嗎? 「.{16}$

這將匹配行尾的任意16個字符。 $確保它匹配行的末尾。


仔細檢查後,如果您想僅提取是不是所有段的線路,你可以使用這個表達式:「{4}(.*?\w.*?)$有前{4},使其之間的分隔符相匹配的空間數字和行的結尾。這在技術上不是「只有16個字符」,但是考慮到數據集,它似乎提供了所需的輸出。 (假設所需的輸出是任何具有單詞字符的行,即字母/數字/下劃線。)

+0

你在正確的軌道上,但應用[a-zA-z] {16} $不起作用:( – 2012-03-15 17:49:35

+0

它看起來像你想要一個結果,只要它不是'.......... ......',所以你可以使用負向前視來確保不匹配:'(?![。] {16})。{16} $',它應該與最後16個字符匹配每一行,除非它是一個16個週期的字符串 – VeeArr 2012-03-15 17:59:36

+0

@VeeArr - 我用'(?![。] {16})。{16} $'跑了一個快速測試,但是這似乎仍然會返回所有行 – TLS 2012-03-15 18:08:41

2

過濾有趣行的廉價技巧是用任何字符填充選擇直到行尾。在這裏,我選擇一個不是一個點的字符,並且它不超過從行尾開始的15個字符。(您可以使用POSIX正則表達式,所以你應該寫\ {\}與否的重複數量{})

grep '[^.].\{1,15\}$' 

然後你可以管與另一個grep,導致測試,也可以適應的想法,另一個正則表達式:

grep 'abc.\{1,13\}$' 

將mach字符串「abc」放在最後16個字符中。