Причина, по которой вы также получаете старые результаты, заключается в том, что вы действительно сравниваете не с этой датой, а с некоторым неопределенным $dt
внутри условия awk
. Тело awk
не является тем местом, где вы используете переменную bash
как есть. Посмотрите, как вы это делаете: https://www.gnu.org/software/gawk/manual/html_node/Using-Shell-Variables.html
dt=$(date +"%D %T")
awk -v dt="$dt" '$0 >= dt && $0 ~ /Connection refused/' file
Алфавитного сравнения кажется достаточно для вашего случая, я полагаю, вы просматриваете журналы за несколько часов или дней (я думаю, что это может выйти из строя только в новогодние праздники или нет, возможно, в зависимости от ротации файлов журнала и вашей среды).
Чтобы ускорить процесс, поскольку ваши строки журнала по-прежнему отсортированы по дате, вы хотите искать из перезапустите отметку времени до конца файла, чтобы вы могли установить флаг, когда найдете эту отметку времени, и проверить шаблон только после этого:
awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} $0 >= dt {f=1}' file
Вы видите, что вы не проверяете снова никакие отметки времени после критическая точка. И в любом случае лучше точно сопоставить последний перезапуск службы (как это сделать, зависит от деталей, а вы их не предоставили), а не сравнивать.
Изменить: в строке образца В вопросе у нас есть временная метка внутри скобок
[08/06/20 11:36:54.577]:Work...
, и это можно передать, например, с помощью этой модификации
awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} substr($0,2) >= dt {f=1}' file
, где substr($0,2)
возвращает $0
без первого символа.