Способы синтаксического анализа файлов журнала, основанных на NCSA
Я сделал немного site:
поиск с помощью Google при сбое сервера, суперпользователе и переполнении стека. Я также проверил результаты, не относящиеся к конкретным сайтам, и не увидел такого вопроса, так что вот так...
Я заметил этот вопрос, связанный с grep и awk, который обладает некоторыми хорошими знаниями, но я не чувствую, что проблема квалификации текста была решена. Этот вопрос также расширяет область применения для любой платформы и любой программы.
У меня есть логи squid или apache, основанные на комбинированном формате NCSA. Когда я говорю "основанный", то есть первые n столбцов в файле соответствуют объединенным стандартам NCSA, может быть больше столбцов с пользовательскими данными.
Вот пример строки из комбинированного журнала Squid:
1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE
Я хотел бы иметь возможность разобрать
n
логи и вывод определенных столбцов, для сортировки, подсчета, поиска уникальных значений и т. д.
Основная проблема, и то, что делает ее немного сложной, а также то, почему я чувствую, что этот вопрос еще не был задан или дан ответ, - это загадка квалификации текста.
Когда я заметил asql из вопроса о grep/awk, я был очень взволнован, но потом понял, что он не поддерживает комбинированные из коробки, что-то, на что я посмотрю расширение, я думаю.
Ждем ответов и изучаем новые вещи! Ответы не должны быть ограничены платформой или программой / языком. В контексте этого вопроса я чаще всего использую Linux или OSX.
ура
2 ответа
Использование Perl, протестировано на v5.10.0, построено для darwin-thread-multi-2level (OSX)
Чтобы напечатать столбец UserAgent:
perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
- вариант
-n
в то время как каждая строка вtest.log
- вариант
-e
однострочная программа
Я украл и настроил Perlre, который я гуглил из поваренной книги PHP. Я удалил $
с конца re для поддержки пользовательских форматов на основе NCSA вместе взятых. Шаблон может быть легко расширен, чтобы обеспечить больше групп.
Группы регулярных выражений ()
в конечном итоге как локальные переменные $1
в $n
Быстро и грязно и очень легко расширять и писать сценарии.
Некоторые примеры передачи результатов:
| sort | uniq
уникальные значения столбца| sort | uniq | wc -l
количество уникальных столбцов
Критика и улучшения приветствуются
Хотя это напрямую не относится к квалификации текста, одним из факторов, который может быть использован в комбинированном формате, является то, что оставшиеся столбцы с разделителями пространства последовательно находятся в одном и том же столбце. Поэтому вы можете обойти эту проблему, используя цикл с printf и NF (количество столбцов)
Согласно awk, $0 - это вся строка ввода, $1 - первый столбец, $2 - второй, а $NF - последний.
Таким образом, для стандартного объединенного NCSA пользовательский агент - от столбца $13 до столбца $NF
Мне нужно было удалить первый столбец и заменить его последним столбцом измененного формата журнала (проксированный IP был добавлен к последнему столбцу).
Таким образом, должен быть возвращен столбец $NF, за которым следует второй столбец ($2), а затем оставшиеся столбцы до NF - 1.
Я смог сделать это с помощью следующего:-
awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log