2011-04-15 64 views
13

我有幾個Apache日誌文件已被附加在一起,我需要按日期排序它們。它們採用以下格式:如何按日期排序Apache日誌文件?

"www.company.com" 192.168.1.1 [01/Jan/2011:00:04:17 +0000] "GET /foobar/servlet/partner/search/results?catID=1158395&country=10190&id=5848716&order_by=N-T&order_by_dir=-&product=10361996&siteID=1169823&state= HTTP/1.1" 200 10459 0 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 

在Linux命令行上執行此操作的最佳方式是什麼?

+0

也許把它移到ServerFault或unix.stackexchange.com? – ohmantics 2011-04-15 05:57:36

回答

27
#!/bin/sh 
if [ ! -f $1 ]; then 
    echo "Usage: $0 " 
    exit 
fi 
echo "Sorting $1" 
sort -t ' ' -k 4.9,4.12n -k 4.5,4.7M -k 4.2,4.3n -k 4.14,4.15n -k 4.17,4.18n -k 4.20,4.21n $1 > $2 
+0

這是一個了不起的答案!謝謝! – dotancohen 2013-10-21 09:28:48

+0

有趣。手冊頁沒有說明你可以使用「M」作爲排序鍵的一部分;感謝您指出了這一點! – offby1 2014-08-05 18:50:27

+0

很好的答案和完美的Apache日誌,這確實是第4場,假設默認分隔符是一個空格。在排序手冊頁上花費幾分鐘幫助我理解這個命令,我有信心寫出自己的排序。也可以爲其他讀者添加,這是使用給定字段4中的字符範圍,以便您希望對其進行排序。 -k 4.9,4.12n是年,'n'表示數字排序,-k 4.5,4.7M是3個字母的月份縮寫排序,M告訴它完成該操作。 @ offby1它顯示它作爲一個選項,但這個例子並不好。 – Arturski 2016-10-05 09:30:41

7

這幾乎是太微不足道指出,但只是的情況下,它混​​淆了人:GRM的答案應該在技術上採用現場#3,沒有4,以匹配提問的確切日誌格式。也就是,它應該是:

sort -t ' ' -k 3.9,3.12n -k 3.5,3.7M ... 

他的回答在其他方面都是正確的,並且可以按原樣用於通用日誌格式。

+0

也許這會更好 - 但它是正確的,所以有一些互聯網點:) – STW 2014-07-26 02:50:49

0

我想通了這一點與網上的例子,通過「Linux命令行的書,手冊頁和試錯略讀:

sort -k 3.9nb -k 3.5Mb -k 3.2nb [location and name of file] 

與N或者M的相對於B將排序停止從閱讀沒有意義的字符(比如/和):當空間已被用作分隔符時,這會使生活更輕鬆,而且您仍然必須通過:,/和/或任何其他字符進行分隔。

上面的腳本會按年份先排序,然後按月份排序,然後按日期排序。在所有b的旁邊放一個r來下降。