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

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

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 

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

  • Shell Script не может управлять командой man
  • установка псевдонима для Java9
  • Скопировать файлы и дерево каталогов для файлов в указанном диапазоне
  • Как я могу пропустить пустые файлы с sed?
  • Отправка двоичных данных в get ()
  • Экран - наследует среду текущего окна
  •  > 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 

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

  • whiptail или диалог
  • переименование файлов без команды ** rename **
  • Извлечь текст между тремя одинарными кавычками
  • Предотвращение расширения определенного пространства в переменной
  • Использование инструкции If в Crontab для создания оповещения
  • Скрипт оболочки Gnuplot
  • 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 раза, что может быть дорогостоящим для больших файлов журнала.

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