2016-06-24 69 views
0

有一個日誌文件,如:自動插入空行-f`

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...] 
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...] 

這是下tail -f實時監控,纔有可能自動插入(通過我們將命令管道到tail)之後,「空行」,比方說,2秒的不活動?

預期結果:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...] 
--- 
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...] 

(因爲存在着超過2秒2條連續的線之間的間隙)。

回答

1
awk -F'[][\\- ,:]+' '1' 

上面將上][-,:分割字段,從而如下所述的每個字段:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 
22222 3333 44 55 66 77 88 999 ... 

然後,您可以連接一些字段並使用它來測量時間差異:

tail -f input.log | awk -F'[][\\- ,:]+' '{ curr=$3$4$5$6$7$8$9 } 
         prev + 2000 < curr { print "" } # Print empty line if two seconds 
                 # have passed since last record. 
             { prev=curr } 1' 
+0

奇妙的短!非常感謝這件美麗的藝術品。 – user3341592

+0

我意識到我有一些多線「事件」,即帶時間戳和所有的第一行;沒有這樣的前綴的行。你怎麼能考慮到這一點? – user3341592

+0

在DST或閏日或閏秒過渡期間,這種行爲不如預期。這可能是好的,但需要注意的地方。 –

0

tail沒有這樣的特徵。如果你希望你可以實現一個檢查文件最後一行的程序或腳本;類似的信息(僞)

previous_last_line = last line of your file 
while(sleep 2 seconds) 
    { 
    if (last_line == previous_last_line) 
     print newline 
    else 
     print lines since previous_last_line 
    } 

兩個備註:

  • 這將導致你在進行二秒無輸出;您可以更頻繁地檢查最後一行並保留時間戳;但這需要更多的代碼...
  • 這取決於所有行都是唯一的;這對你來說是合理的;因爲你在每一行有時間戳
+0

實際上,腳本不應該等待2秒鐘。但是,如果日誌中沒有任何活動2秒或更長時間,可以先插入空白行。 – user3341592

+0

我知道,這是我提出的腳本的「不良副作用」。就像我說的;你可以考慮另一種處理方法;更頻繁地檢查文件的最後一行;並按照你所看到的輸出每一行;保留最後一次看到一條線的時間戳,......但這可能會非常快速地耗費資源...... –