Способы синтаксического анализа файлов журнала, основанных на 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
Другие вопросы по тегам