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

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

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 

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

  • Хорошая или плохая практика? Перенаправление на stderr?
  • Как перечислять файлы с именем XXXmmyy.dat в естественном хронологическом порядке?
  • Как установка бита Setuid влияет на сценарии оболочки, которые запускаются при загрузке системы, до того, как произошел какой-либо логин?
  • Вырезать письмо из каждой строки файла
  • Что делает оболочку интерпретировать эти перенаправления следующим образом?
  • Изменение числового значения в файле с помощью Vim из сценария
  • Найдите конкретную вложенность имен каталогов, например ... / project / dir1 / dir2
  • Запуск скрипта после загрузки tty1
  • 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 - лучшая ОС в мире.