2014-10-07 33 views
1

我們有包含Apache Http客戶端輸出的日誌文件。因爲它去「過線」我們看到輸出,它包括象線路:嘗試使用sed着色Apache http連線日誌

< < HTTP/1.1 200請求已成功

的人字形「< <」表示傳入,在與傳出內容的'>>'形成鮮明對比。使用'tail -F'來跟蹤這些日誌足夠有趣,但我認爲使用sed根據輸入或輸出來着色輸出將是一個有用的練習。

一個簡單的測試會告訴你我是什麼意思:

echo '<< HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i'

輸入,並

echo '>> HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i'

輸出。

到目前爲止,這麼好。當我想到突出顯示HTTP響應代碼並根據類對它們着色時更加有用,例如,2xx爲綠色,5xx爲紅色,這種情況開始出現在正則表達式瘋狂中。

到目前爲止,我可以匹配到第一個數字與響應代碼: echo '<< HTTP/1.1 200 The request has succeeded' | sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_i' -e 's_>>_\x1b[32;1m&\x1b[0m_i' -e 's_HTTP[^[:alpha:]]*2\d*_\x1b[32;1m&\x1b[0m_g'

它只是着色達,<< HTTP/1.1 2。我的期望是HTTP[^[:alpha:]]*2\d*會匹配'HTTP',接下來是所有不是按字母順序排列的'2',然後是任意數字。理想情況下,我會使用「{2}」而不是「*」,但這具有相同的效果。

任何正則表達式大師能指出我的錯誤嗎?

回答

1
echo '<< HTTP/1.1 200 The request has succeeded' | \ 
sed -r -e 's_<<_\x1b[31;1m&\x1b[0m_;t http 
      s_>>_\x1b[32;1m&\x1b[0m_ 
:http 
      s_HTTP[^[:alpha:]]\{1,\}2[0-9]\{1,\}\x1b[32;1m&\x1b[0m_g' 

試試這個。

  • 刪除i<<一結束,>>線,因爲這是從來沒有大寫或小寫
  • 變化*{2}通過\{1,\},但也可以在GNU使用+ sed的
  • 增加可選t http:http,因爲你一定會走的更遠,有些跳躍會使你的分機更快

也嘗試-u爲無緩衝,這是更好的真實流

+0

謝謝。我不得不刪除我的終端的大括號內的'\'。我現在對於2xx響應和's_HTTP [^ [:alpha:] {1,} 2 [0-9] {1,} _ \ x1b [32; 1m&x1b [0m_g'] :]] {1,} 5 [0-9] {1,} _ \ x1b [31; 1m&x1b [0m_g' for 5xx。 – dougal2K 2014-10-07 11:49:08

+0

奇怪的是,如果不使用帶'-E'的GNU sed,並且肯定使用posix版本(我在AIX上測試),則需要在sed上刪除'\'。如果它在你的終端上運行,那就是目標。最後的'g'也是不需要的,每行只有一個序列 – NeronLeVelu 2014-10-07 11:52:21