Intereting Posts
«Наложить» подсказку оболочки поверх сеанса терминала? Как легко обновить список md5sums? Преобразуйте ps в pdf с помощью ps2pdf, но файл pdf не очень хорош Судо не работает в chroot Как создать rootfs для пользовательского режима Linux на Fedora 18? Замещать несколько форматов звукового файла без дефляции Разделение Awk и условная печать Intel HDI Sound (ThinkPad X60) не работает без диспетчера дисплея Установка модулей python для python2.6 При загрузке tmux по умолчанию при запуске zsh-терминала Как настроить мой gnome pannel, если он не отвечает на щелчок правой кнопкой мыши? Запретить удаление файла даже после того, как rm -f В отчетах SAR% commit включает использование кеша страницы? Как создать список символов, встречающихся перед определенным символом, только в строках, содержащих другой определенный символ с использованием регулярного выражения? Спящий режим двойной загрузочной машины с разделяемым разделом для записи

Извлеките весь трафик, соответствующий запросу с параметром

Для каждой строки access.log с шаблоном /mypattern :

 www.example.com:80 192.0.2.17 - - [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5 

Я хотел бы извлечь параметр iptosearch и показать все строки access.log которые имеют этот IP-адрес и который содержит blah . Пример:

  [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ... www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ... [27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ... 

Я пытаюсь сделать это с помощью:

 grep -f <(grep -o 'mypattern.*iptosearch=(.*)' access.log) access.log |grep blah 

но:

  • он, вероятно, не будет отсортирован, как в моем примере раньше: с заголовком и приведенным ниже списком, соответствующим соответствующему iptosearch

  • заголовок в моем примере ( [29/Sep/2017:13:49:02 +0200] "GET /test?foo=bar&iptosearch=198.51.100.5: не будет отображаться, потому что он не содержит blah

Как это сделать, чтобы иметь дисплей, как раньше? Следует ли использовать цикл в таком случае, как?

Расширенный подход bash + grep + awk :

Пример содержимого access.log :

 www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ... [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ... www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... [27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ... 

Работа:

 grep '/mypattern' access.log | while read -rl; do if [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]]; then echo "$l" awk -v ip="${BASH_REMATCH[1]}" '$0~ip && /blah/;END{ print "" }' access.log fi done 

Выход:

 [29/Sep/2017:13:49:02 +0200] "GET /mypattern?foo=bar&iptosearch=198.51.100.5: www.example3.com:80 198.51.100.5 - - [27/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... www.example2.com:80 198.51.100.5 - - [25/Sep/2017:00:00:00 +0200] "GET /blah.html" ... www.example7.com:80 198.51.100.5 - - [12/Sep/2017:00:00:00 +0200] "GET /index.htm?i=blah" ... [27/Sep/2017:00:00:00 +0200] "GET /mypattern?iptosearch=203.0.113.2&foo2=bar5: www.example32.com:80 203.0.113.2 - - [15/Sep/2017:00:00:00 +0200] "GET /hello/blah" ... www.example215.com:80 203.0.113.2 - - [14/Sep/2017:00:00:00 +0200] "GET /blah.html" ... 

Детали:

  • while read -rl ... – повторение строк, содержащих /mypattern , возвращенных командой grep

  • [[ $l =~ iptosearch=(([0-9]+\.){3}[0-9]+) ]] – сопоставлять каждую строку $l с регулярным выражением iptosearch=(([0-9]+\.){3}[0-9]+) .
    BASH_REMATCH – это переменная массива, члены которой назначаются двоичным оператором ' =~ ' команде [[ условная команда. Элемент с индексом 0 является частью строки, соответствующей всему регулярному выражению. Элемент с индексом n является частью строки, соответствующей n го подвыражения в скобках (...) . Эта переменная доступна только для чтения.

  • -v ip="${BASH_REMATCH[1]}" – передача переменной ip в awk- скрипт

  • $0~ip && /blah/ – вывод только строк, содержащих текущее значение ip и ключевое слово blah

 awk '/blah/ && $2 == "198.51.100.5" { print }' access.log 

Найдите все строки с текстом blah внутри. Если второе поле с разделителем – поле «198.51.100.5», напечатайте строку.