2016-11-27 160 views
1

我想知道是否有更好的方法來分割日誌文本文件,而不是在下面執行shell循環,理想情況下是使用單個shell命令。Linux shell命令拆分日誌文件

日誌文件看起來像這樣:

2016-11-20T16:19:21+00:00 Logging started 
2016-11-20T16:20:41+00:00 System is up 
2016-11-20T16:21:07+00:00 Unknown event 45 
... 
2016-11-25T08:40:00+00:00 Blah blah 
2016-11-25T08:42:00+00:00 Blah blah 
... 
2016-11-27T11:32:00+00:00 System powering down 
  • 所有行開始與ISO8601日期標記(UTC)
  • 的線是按時間順序排列,由建設,因爲線路被追加時有一個事件要記錄。
  • 文件越來越大

所以,我們要完成的任務是將文件在給定時間分割。 假設我只保留最後一週的條目以避免日益增長的綜合徵。

因此,有一個日期'2016-11-25T08:41:00 + 00:00',我希望只保留那些日期後的條目。 請注意,我們想要剪切文件的日期不必與現有條目相對應(如示例中所示)。

所以,我能做的最好的是一段代碼那樣:

WHEN='2016-11-25T08:41:00+00:00' # actually that is read as a parameter 

while read line; do 
    if [ "${line}" \> "${WHEN}" ]; then 
    echo "${line}" 
    fi 
done <"${LOGFILE}" >"${CUTFILE}" 

這樣的作品,但因爲它是一個shell循環,如果該文件變得非常大的可能是緩慢的。

因此,任何更好的建議與標準的命令/工具?

+0

您可以使用'awk'嗎? – Inian

+0

不要重新發明車輪。使用['logrotate'](http://www.linuxcommand.org/man_pages/logrotate8.html)。它有很多有趣的選項,例如壓縮文件並將文件移動到「舊」日誌,郵件等目錄。它會評估日誌的大小,時間(旋轉的頻率),但不評估文件內容。我認爲你甚至不需要後者。 –

+0

確實Ruslan,我需要的是完全logrotate +文件內容! – Zakhar

回答

1

可以使用下面的命令:

grep的將匹配圖案(2016年11月25日)的第一次出現和-n將打印相應的行數與匹配沿着
tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile 

-m1選項模式。

例如日誌文件從上方

[email protected]:/home# cat logfile 
2016-11-20T16:19:21+00:00 Logging started 
2016-11-20T16:20:41+00:00 System is up 
2016-11-20T16:21:07+00:00 Unknown event 45 
2016-11-25T08:40:00+00:00 Blah blah 
2016-11-25T08:39:02+00:00 Blah blah 
2016-11-25T08:39:04+00:00 Blah blah 
2016-11-25T08:42:00+00:00 Blah blah 
2016-11-27T11:32:00+00:00 System powering down 

grepping所需圖案「2016年11月25日」

[email protected]:/home# cat logfile | grep -m1 -n "2016-11-25" 
4:2016-11-25T08:40:00+00:00 Blah blah 

採取與定界符上述輸出用切口命令的第一個值「:」

[email protected]:/home# cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1 
4 

並將其傳遞給尾部命令「tail -n +」以獲取所需的輸出

[email protected]:/home# tail -n +$(cat logfile | grep -m1 -n "2016-11-25" | cut -d: -f1) logfile 
2016-11-25T08:40:00+00:00 Blah blah 
2016-11-25T08:39:02+00:00 Blah blah 
2016-11-25T08:39:04+00:00 Blah blah 
2016-11-25T08:42:00+00:00 Blah blah 
2016-11-27T11:32:00+00:00 System powering down