Извлечение запросов из файла журнала, которые не включают запрещенные строки

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

query1 startQuery query1 do something query1 do something else query2 startQuery query1 do something banned query2 do something query3 startQuery query2 endQuery 1000 query3 something else to do query1 endQuery 2003 query3 do something query4 startQuery query4 endQuery 100 query3 endQuery 1434 

Я нахожу самые длинные запущенные запросы:

 > grep "endQuery" logfile | awk '{print $3 " " $1}' | sort -nr | head -n 3 2003 query1 1434 query3 1000 query2 

Тем не менее, есть определенные операции, которые, как известно, длинны, и я хочу найти самые длинные запущенные запросы, которые не включают эти операции. Например, я хочу найти самые длинные запущенные запросы, которых нет в любой из строк журнала, включая слово «banned».

В этом примере он выводит:

 1434 query3 1000 query2 100 query4 

На самом деле эти файлы журналов большие и содержат много запросов.

  • извлечение поля даты из строк
  • shell для цикла с поиском с именами файлов, содержащими пробелы
  • Как добавить дату ко всем файлам в каталоге, не касаясь подкаталогов через скрипт bash
  • скрипт, выполняющийся в crontab, не выдающий вывод на экран оболочки
  • Команда Bash: возможно ли передать аргумент перед пользовательской командой (функцией) или она должна быть только после:
  • Крошечный и простой скрипт терпит неудачу, и это результат «Нет такого файла или каталога»,
  • Cron не запускается в определенный день, но все остальные дни
  • Как создать несколько файлов tar с помощью сценария bash и использовать дату в качестве имен файлов?
  • 2 Solutions collect form web for “Извлечение запросов из файла журнала, которые не включают запрещенные строки”

    Во-первых, обратите внимание, что вам не нужен вызов grep , кстати: он может быть легко интегрирован в вызов awk .

     <logfile awk '/endQuery/ {print $3 " " $1}' 

    Вы можете отфильтровать заблокированные запросы на этапе awk. Храните текущие запросы в массиве, удаляйте их, если они запрещены, и распечатывайте только неблокируемые.

     <logfile awk ' $2 == "startQuery" {q[$1]=1} # store the names of active queries q[$1] && /banned/ {delete q[$1]} # delete banned queries $2 == "endQuery" { if (q[$1]) print $3, $1; # only report non-banned queries delete q[$1]; } ' | sort -nr | head -n 3 

    Мне удалось сформулировать следующее:

     diff <(grep "endQuery" logfile | awk '{print $1}') \ <(grep "banned" logfile | awk '{print $1}') | \ grep "<" | awk '{print $2}' | xargs -I{0} grep "{0} endQuery" logfile | \ awk '{print $3 " " $1}' | sort -nr | head -n3 1434 query3 1000 query2 100 query4 

    Тем не менее, это требует grepping через файл журнала 3 раза, что может быть дорогостоящим для больших файлов журнала.

    Interesting Posts

    Установляет ~ / .bashrc среду для пользователей, чья оболочка / sbin / nologin?

    Как я могу разбить USB-накопитель так, чтобы он был загрузочным и имел Windows-совместимый раздел хранения данных?

    tmux: создание нового сплит-окна не работает

    Использование инструмента Perf для ядер A7 и A15 (Big.Little) на платах XU3 / XU4

    Как правильно выполнить grep на выходе ldd?

    Функция Shell, которая потребляет два аргумента за одну итерацию цикла

    Как найти recurse в подкаталоги при использовании опции -prune

    Групповое совпадение с grep включает дополнительные символы

    Проблемы с сервером ключей PGP и прокси-сервера

    Компилятор C не может создавать исполняемые файлы

    Разведенная строка ввода на экране GNU

    Linux sed – поиск подстановочной строки без пробелов в ней

    Как гарантировать наличие $ BASH_ENV

    Возможно ли использование SMTP через SSL в клиенте электронной почты Balsa?

    Решение сервера, пересылка HTTP-трафика

    Linux и Unix - лучшая ОС в мире.