Как собрать информацию об IP и пользовательском агенте из веб-журнала с помощью AWK?

У меня есть файл журнала, содержащий текст, например:

66.249.74.18 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.jpg HTTP/1.1" 7691 "-" "Googlebot-Image/1.0" "-"
220.181.108.96 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.html HTTP/1.1" 17722 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "-"

Я хочу собрать всю информацию об ip и пользовательском агенте в файл:

66.249.74.18 "Googlebot-Image/1.0"
220.181.108.96 "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

Как я могу сделать это с помощью awk?

Я знаю, что awk '{print $1}' может перечислить все ips, а awk -F\" '{print $6}' может перечислить все пользовательские агенты, но я понятия не имею, как объединить их в вывод.


person yang    schedule 21.04.2013    source источник


Ответы (4)


Портативный подход без использования расширений GNU:

awk '{printf "%s ",$1;for(i=12;i<NF;i++)printf "%s ",$i;printf "\n"}' file
person Chris Seymour    schedule 21.04.2013
comment
он возвращает: 66.249.74.18 GET /1.jpg HTTP/1.1 7691 - Googlebot-Image/1.0 220.181.108.96 GET /1.html HTTP/1.1 17722 - Mozilla/5.0 (совместимый; Baiduspider/2.0; +baidu.com/search/spider.html), но awk '{printf %s ,$1;for(i =7;i‹NF;i++)printf %s ,$i;printf \n}' test.log | awk -F\ '{print $2 $8}' может получить то, что я хочу. Можешь сделать короче? - person yang; 22.04.2013
comment
@user432506 user432506 да, вы хотите от i=12 увидеть обновление. Если это решит вашу проблему, пожалуйста, проголосуйте и примите этот ответ, чтобы принять ответ, нажмите на галочку рядом с вопросом, это покажет вопрос как решенный. - person Chris Seymour; 22.04.2013
comment
как выбрать определенные данные даты из файла с помощью команды awk @iiSeymour - person saikiran; 27.11.2014

awk '{print $1,$6}' FPAT='(^| )[0-9.]+|"[^"]*"'
  • define a field as
    • start with beginning of line or space
    • затем [0-9.]+ или "[^"]*"
  • затем распечатайте поля 1 и 6
person Steven Penny    schedule 21.04.2013
comment
Есть ли способ сначала добавить кавычки в поля ip? Затем я мог бы использовать awk -F\ '{print $2 $8}', чтобы получить правильный результат. - person yang; 21.04.2013

awk -F' - |\\"' '{print $1, $7}' temp1

выход:

66.249.74.18 Googlebot-Image/1.0
220.181.108.96 Mozilla/5.0 (compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)

файл temp1:

66.249.74.18 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.jpg HTTP/1.1" 7691 "-" "Googlebot-Image/1.0" "-"
220.181.108.96 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.html HTTP/1.1" 17722 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"     "-"
person Scy    schedule 22.04.2013

Использование perl:

perl -nle '/^((?:\d+\.?){4})(?:.+?"){4}\s+(".*?")/ && print "$1 $2"' access_log

Хитрость заключается в подсчете символов, которые не являются двойными кавычками + двойными кавычками: (?:.+?"){4}. Вот визуальное описание регулярного выражения: https://regex101.com/r/xP0kF4/4.

Регулярное выражение более сложное, чем предыдущие ответы, но мы могли легко анализировать другие свойства.

person luissquall    schedule 19.02.2016