Как я могу сортировать файл журнала 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?

Ответ 1

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

Ответ 2

Это почти слишком тривиально, но на всякий случай это смущает кого-либо: ответ grm должен технически использовать поле № 3, а не 4, чтобы соответствовать точной форме журнала опроса. То есть, он должен читать:

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

Его ответ правильный во всех других отношениях и может использоваться как-для общего формата журнала.

Ответ 3

Я понял это с помощью онлайн-примеров, просматривая книгу "Командная строка Linux", страницы руководства и пробная версия:

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

b вместе с n или M прекратит сортировку с чтения символов, которые не имеют смысла, таких как/и: что облегчает жизнь, когда пространство уже используется в качестве разделителя, и вам все равно придется отделять:,/, и/или любой другой символ, который вы хотите поразить при сортировке.

Вышеуказанный script будет сортироваться по годам сначала, затем по месяцам, а затем по дате. Поместите r рядом со всем b, чтобы спуститься.