Я сделал немного 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.
Ура
Использование 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