Мне нужен скрипт bash для поиска в журнале слов Failed и fail. Но только с последнего часа

cut -c 5- /var/log/mail.log | awk '($0 >= from)' from="$(LC_TIME=C date +'%_d %H:%M:%S' -d -1hour)" |grep -i 'Failed:\|failure'

Пример файла журнала

Nov  1 01:00:00 localhost pushmail[55555]: 666666666666: Failed 
Nov  2 15:00:00 localhost pushmail[55556]: 666666666666: Failed 
Nov  3 11:00:00 localhost pushmail[55557]: 666666666666: Failed 
Nov  3 12:00:00 localhost pushmail[55558]: 666666666666: Failed 
Nov  3 13:30:00 localhost pushmail[55559]: 666666666666: Failed 
Nov  3 13:40:00 localhost pushmail[55560]: 666666666666: Failed 
Nov  3 14:00:00 localhost pushmail[55561]: 666666666666: Failed 
Nov  3 15:00:00 localhost pushmail[55562]: 666666666666: Failed 
Nov 14 15:00:00 localhost pushmail[55563]: 666666666666: Failed 

Я использую вырезать, чтобы удалить название местного месяца. Но когда у меня есть в форме записи журнала два дня назад, у меня есть это в результатах.

3 ответа3

1

Самое надежное решение, которое я смог найти, это:

while read -r rec
do   age=$(($(date +%s)-$(date -d "${rec:0:16}" +%s)))
     [ $age -ge 0 -a $age -le 3600 ] && \
     grep -Eiq 'failed|failure' <<< "$rec" && echo "$rec"
done </var/log/mail.log

Это использует date для преобразования зарегистрированного времени в секунды с начала 1970 года, а затем сравнивает их со значением секунд для текущего времени. Это будет работать во всех случаях, включая час после полуночи, кроме первого часа нового года, потому что date -d умолчанию соответствует текущему году, когда ни один не указан. Я предполагаю, что у вас будут дела поважнее, чем запускать этот сценарий на рассвете нового года.

Проверка того, что возраст записи неотрицателен, исключает будущие записи, как я обнаружил в записи от 14 ноября при тестировании 3 ноября. Я симулировал вызов в разное время, добавив параметр -d к первому вызову date , который в ответе получает текущую ссылку времени.

0

Проблема в том, что "14">" 3" потому что 1> "". Вы должны использовать ведущие нули в ваших датах. Например, вы можете поместить все команды в один awk:

awk '{ date = sprintf("%02d %s",$2,$3) }
     date>from && /Failed|failure/ { print }
' from="$(LC_TIME=C date +'%d %H:%M:%S' -d -1hour)"

Я изменил %_d на %d чтобы получить начальные нули от даты. В awk sprintf использует %02d чтобы поставить начальный ноль в поле 2, дату.

0

awk '($ 0> = from)' from = "$(LC_ALL = C date +'% b% _d% H:% M:% S' -d -1hour)" ~/mail.log | grep -i 'Не удалось \| неудача»

Привет! Спасибо всем за помощь! В моем случае этот скрипт работает. если вы хотите изменить интервал времени от 1 часа, вы можете сделать это в качестве значения изменения, например -d -60minutes или -d -2days

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .