2015-10-28 161 views
3

我正在尋找一種方法將過去兩天的多個日誌文件查看爲單個傳遞。從昨天/今天查看日誌

起初,我嘗試使用grep:

#!/bin/bash 

yesterday=$(date --date="yesterday" +"%Y-%m-%d") 
today=$(date +"%Y-%m-%d") 
grep "$yesterday\|$today" *.log | less 

這是好的,但它不輸出線在比賽中(沒有在他們的日期,例如錯誤的堆棧跟蹤線之間 - 這什麼是我真正感興趣的)...

所以我發現這一點:

#!/bin/bash 

yesterday=$(date --date="yesterday" +"%Y-%m-%d") 
sed -ne '/$yesterday/,$p' *.log | less 

對於每一個文件,它輸出一切從第一場比賽到文件的末尾。這只是完美的......除了一件事......在閱讀時,我不知道我在看哪個文件的內容。我希望在每行的開始處看到文件名,就像使用grep一樣。

  • 如何在我的sed命令中將每個行的文件名加前綴?
  • 會有更好/更好的方法來做到這一點?

感謝;-)

+0

選中此項:http://www.tecmint.com/view-multiple-files-in-linux/ – Noproblem

+2

你錯過了本質。你的日誌格式是什麼(示例) – NeronLeVelu

+0

我認爲你應該使用'for'並在'echo'前加上文件名。另外,注意'sed'將它的參數視爲一個連續的長流,所以在你的例子中,我認爲這不是你想要的(如果可用,你可以傳遞'--separate'選項)。 – whoan

回答

1

不是sed解決方案,但你問一個更好的/更好的方式來做到這一點 ...如果你有GNU awk的地方,

awk -v day="$yesterday" 'BEGINFILE {run=0} $0 ~ day {run=1} run == 1 {print FILENAME, $0}' *.log 

應該做到。

說明:

GNU awk的處理順序中的所有文件。 GNU awk變量day初始化爲shell表達式"$yesterday" GNU awk在處理新文件之前執行BEGINFILE規則。此規則將清除run變量。每當一行($0)匹配GNU awk變量day"$yesterday")時,將設置run變量。當設置了run變量時,將打印當前文件的名稱(FILENAME),後跟當前行($0)。

+0

我回答有點晚,但我一直在使用您的解決方案一段時間,它效果很好!謝謝 ;-) – user280767

相關問題