Команда grep для поиска с двумя условиями

У меня есть лог, содержащий медленные sql запросы

2022-08-13 19:15:17.170 INFO 550034 --- [ scheduling-3] org.hibernate.SQL_SLOW : SlowQuery: 11387 milliseconds. SQL:

Нужна grep команда, для вывода количества медленных sql запросов за последний час, у которых время запроса более 10000 ms

Я пытался делать командой

grep "SQL_SLOW" app.log | wc - l

Но не знаю как добавить условия:

  1. Время было в рамках часа (первые 19 символов лога). Текущее время минус час
  2. Время sql запроса было более 10000 ms (в примере 11387 ms)

Ответы (2 шт):

Автор решения: Vadik

Попробуйте следующим способом:

date0="$(date -d '0 hour ago' '+%Y-%m-%d %H')"
date1="$(date -d '1 hour ago' '+%Y-%m-%d %H')"
grep "SQL_SLOW" "app.log" \
  | grep "^\($date0\|$date1\)" \
  | grep -P "SlowQuery: \d{5,} milliseconds" \
  | wc -l

Эта команда выведет логи за текущий час и за предыдущий. Опция -P включает регулярные выражения в стиле Perl.

→ Ссылка
Автор решения: Zt.
T1=$(date '+%s') # date +%s -d "2022-08-13 19:15:17"
T2=$[T1-60*60]   # date +%s -d "2022-08-13 18:15:17"
N=10000
awk -v n=$N '/SQL_SLOW/ && $11>=n {system("date +%s -d \""$1" "$2"\"")}' app.log \
| awk -v t1=$T1 -v t2=$T2 '$0<=t1 && $0>=t2' \
| wc -l

данный код позволит с точностью до секунды указывать любой диапазон через unix timestamp

→ Ссылка