我有几个已经附加在一起的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 :(得分: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