2014-11-04 17 views
2

我有一個海量日誌文件,其中包含設備驅動程序失敗的示例。驅動程序應該提供來自客戶端應用程序讀取的緩衝區的數據。驅動程序在讀取前後記錄緩衝區中的數據量,並以512字節塊將數據傳輸到客戶端。日誌文件中有很多垃圾數據隨機散佈在多行中。下面是一個簡單的例子或一個正常的工作案例。VIM - 正則表達式 - 多行搜索查詢字段值的更改

Before Transfer 1: Available 512 bytes 
... junk data 
After Transfer 1: Available 0 bytes 
... junk data 
Before Transfer 2: Available 512 bytes 
... junk data 
After Transfer 2: Available 0 bytes 

在錯誤的情況下,它看起來像這樣(下轉數從一個具體的例子就是,這個問題並不總是對轉讓#35發生):

Before Transfer 34: Available 512 bytes 
... junk data 
After Transfer 34: Available 0 bytes 
... junk data 
Before Transfer 35: Available 512 bytes 
... junk data 
After Transfer 35: Available 512 bytes 

所以,我試圖匹配多行查詢,其中單個傳輸報告「Before」和「After」日誌語句中的「available」相同的量。

我已經試過這樣::%s/Before Transfer.* 512 bytes\._*After Transfer.* 512 bytes,並幫助找到的問題的一些,但數額可能是1024或256,或在「之前」和256個字節的若干倍「後」日誌語句。

此外,此查詢似乎突出顯示了VIM中超過一半的文件緩衝區。我假設這是因爲它找到了其他查詢中的匹配查詢(即:嵌套結果),因爲我沒有提供一種方法來匹配對應的「之前」/「之後」實例編號在日誌文件中。

我想建立一個正則表達式,通過每個匹配「之前」和「之後」的日誌行雲,看數據值(字節數)是相同的兩個「之前」和「之後」。如果滿足這兩個條件,就正則表達式搜索查詢而言,它是「匹配」。所需的輸出,在文件的情況下,我更多或更少的人工分析,就像這樣:

Before Transfer 35: Available 512 bytes 
After Transfer 35: Available 512 bytes 
Before Transfer 105: Available 256 bytes 
After Transfer 105: Available 256 bytes 
Before Transfer 220: Available 512 bytes 
After Transfer 220: Available 512 bytes 
Before Transfer 250: Available 2048 bytes 
After Transfer 250: Available 2048 bytes 

如何去建立這樣的查詢?

謝謝。

回答

2

使用vim,你可以使用以下步驟

v/\v^(before|after) transfer/d 
%norm J 
v/\vbefore transfer.{-}(\d+ bytes).{-}\1/d 

其中

V /符\ v ^(之前|之後)轉讓/ d
刪除每一行之前不會開始轉移後

%標準J 加入所有的殘留線。請注意,這假定每個之前匹配一個後。如果不是這樣,你就必須刪除孤立行(使用正則表達式:))

V/\ vbefore轉移。{ - }(\ d +字節)。{ - } \ 1/d
刪除每行不包含相同的字節數。

1

如果這並不需要在vim和所有你想要的是失敗的傳輸和緩衝區大小,然後數這將工作:

awk '/^Before Transfer/{s[$3]=$5; next} /^After Transfer/&&(s[$3] == $5) {print "Transfer "$3" failed with "$5" available."; delete s[$3]; next}' 

可以格式化輸出或保存輸入或者做任何你想要的東西,但這就是主意。

1
sed -n '/Before Transfer/ h 
     /After Transfer/ { x 
      G 
      /\(Available *[0-9]* \).*\1/ s/\n/& /p 
      }' YourFile 

之前後只是增加了一個空間,更好的表現和分離