2013-04-03 40 views
-1

我有一個目錄(/home/myuser/logs),它包含以下日誌文​​件的最後5天,以獲得合計日期時間具有相同的結構,只是不同的數據:猛砸/蟒蛇/ perl的神奇跨越多個日誌文件

<timestamp> | <fruit> | <color> | <cost> 

因此,例如,applogs_20130402.txt可能看起來像:

23:41:25 | apple | red | 53 
23:41:26 | kiwi | brown | 12 
23:41:29 | banana | yellow | 1023 
... (etc., every line is pipe delimited like this) 

我想創建一個「主日誌」,它將所有5個日誌文件中的所有日誌條目(結構化,管道分隔的行)合併到一個文件中,所有時間戳按時間順序排列。此外,我還需要反映在時間戳中的日期。

所以,舉例來說,如果applogs_20130402.txtapplogs_20130401.txt都在目錄中只有2個applogs,他們都分別是這樣的:

applogs_20130402.txt: 
===================== 
23:41:25 | apple | red | 53 
23:41:26 | kiwi | brown | 12 
23:41:29 | banana | yellow | 1023 

applogs_20130401.txt: 
===================== 
23:40:33 | blueberry | blue | 4 
23:41:28 | apple | green | 81 
23:45:49 | plumb | purple | 284 

然後,我想一個masterlog.txt文件看起來像:

2013-04-01 23:40:33 | blueberry | blue | 4 
2013-04-01 23:41:28 | apple | green | 81 
2013-04-01 23:45:49 | plumb | purple | 284 
2013-04-02 23:41:25 | apple | red | 53 
2013-04-02 23:41:26 | kiwi | brown | 12 
2013-04-02 23:41:29 | banana | yellow | 1023 

我在Ubuntu上,有權訪問Bash,python和perl,並且沒有使用哪種解決方案的優先權。通常我會嘗試一個「最佳嘗試」併發布它,但我從來沒有在Linux上處理過這樣的聚合數據。顯然,日誌的大小是數千行,與上面的示例不同。所以手動做所有事情都不是一個選項;-)提前致謝!

+0

爲什麼downvote? – IAmYourFaja 2013-04-03 18:48:49

+0

似乎很容易與一些命令行程序,但你有什麼嘗試?我沒有投票,但我會說這是因爲你沒有包括你的努力。 – squiguy 2013-04-03 18:50:05

+2

如果你在Windows或Linux上,這並不重要。我不是downvoter,但我認爲除了描述問題之外還有一點努力不會受到傷害。 – simbabque 2013-04-03 18:50:08

回答

1

你可以在命令行中加上sort像這樣使用Perl:

perl -n -e 'printf "%d-%02d-%02d %s", $ARGV =~ m/_(\d{4})(\d\d)(\d\d)/, $_;' *.txt | sort -n 

Calling perl with -n環繞你的程序,在這種情況下是-e ''的東東while (<>) { }。在這裏,我們printf目前的行($_),並在我們的前面,把從文件名稱的日期,其中is stored in $ARGV。我們使用regex來獲取年,月和日,由於printf的列表上下文,因此可以方便地返回m//

對於這個程序,我們傳遞文件夾中的所有txt文件。結果被傳送到命令行工具sort,它使用-n標誌對數字進行排序。

+0

謝謝@simbabque(+1) - 當我輸入這個命令並敲回車(在終端內)時,我看到一個帶有「>」字符的新行,沒有任何反應。有任何想法嗎?再次感謝! – IAmYourFaja 2013-04-03 19:20:33

+1

由於創建完全限定日期和時間,我認爲你可以使用沒有'-n'標誌的排序,因爲它們可以按字母順序排序。我認爲你在$ _之後缺少單引號;和* .txt之前。 – 2013-04-03 19:28:36

+0

再次感謝,但仍然一樣。這幾乎就像是打開一個「會議」或什麼,或者等待我的某種輸入...... – IAmYourFaja 2013-04-03 19:30:46

0

只是爲了完整起見,這裏是一個(G)AWK的一行來完成相同的:

gawk '{ printf "%s %s\n", gensub(/.+_([0-9]{4})([0-9]{2})([0-9]{2}).+/, "\\1-\\2-\\3", "", FILENAME), $0 }' applogs_* | sort