如何按日期对Apache日志文件进行排序?

时间:2011-04-15 05:31:29

标签: apache sorting date

我有几个已经附加在一起的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命令行上执行此操作的最佳方法是什么?

4 个答案:

答案 0 :(得分:30)

#!/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

答案 1 :(得分:8)

这几乎是微不足道的,但只是以防万一迷惑:grm的答案在技术上应该使用字段#3而不是4来匹配提问者的确切日志格式。也就是说,它应该是:

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

他的答案在其他方面都是正确的,并且可以按原样用于通用日志格式。

答案 2 :(得分:0)

我通过在线示例了解了这一点,浏览了“The Linux Command Line”一书,手册页以及反复试验:

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

b与n或M一起将停止排序读取没有意义的字符,例如/和:当空间已经用作分隔符时,生活更容易,你仍需要分开:,/ ,和/或您希望在排序时选择的任何其他角色。

上述脚本将按年份排序,然后按月份按日期排序。在所有b的旁边放一个r来下降。

答案 3 :(得分:0)

当日志行可能包含多个 ip 地址(以 ', ' 分隔)时,使用 ' ' 作为字段分隔符失败

尝试使用

sort -t '[' -k 2.8,2.11n -k 2.4,2.6M -k 2.1,2.2n -k 2.13,2.14n -k 2.16,2.17n -k 2.19,2.20n