Сценарий оболочки для извлечения журналов за последние 24 часа

Мы пытаемся извлечь журналы из файла, нам нужны все записи, соответствующие шаблону, и отметка времени в течение последних 24 часов.

мой лог выглядит так:

2014-07-01 01:15:59,486 WARN 86c9c59c-c362-48d5-bd8c-fb4c8b616f5a 169.179.101.7 CITIKYC_164283 stence.audit.support.impl.AuditUtilsImpl: 274 — обновления аудита выполнены успешно

2014-07-01 01:15:59,487 WARN 86c9c59c-c362-48d5-bd8c-fb4c8b616f5a 169.179.101.7 CITIKYC_164283 stence.audit.support.impl.AuditUtilsImpl: 173 - Дублирование регистрации, пропуск регистрации...

2014-07-01 01:15:59,488 Бла-бла..

до сих пор мы получили журналы предыдущего дня

D=$(date +"%Y-%m-%d" -d "-1 days")
cat citikyc.log | awk '/'$D' /, /'$D' / { print $0 }' | grep "Exception\|at.*\.java\:.*" | mail -s "TESTING" [email protected]

Пожалуйста, помогите нам получить журнал за последние 24 часа.

Заранее спасибо...!!


person HackSparrow    schedule 02.07.2014    source источник


Ответы (2)


попробуйте этот однострочник:

awk -v d="$(date -d'24 hours ago' +'%F %T,000')" '$1" "$2>=d &&/YourSearch/' log

Не проверял, надеюсь, не опечатка.

date -d'24 hours ago' +'%F %T,000' даст вам метку времени 24 часа назад от текущего.

YourSearch – это шаблон поиска (регулярное выражение).

добавьте тест, чтобы показать, как это работает:

#this is my current time
kent$  date +'%F %T'
2014-07-02 15:27:46

#file content, so only last 3 lines are in "last 24 hours"
kent$  cat f
2014-06-01 01:15:59,123 foo
2014-07-01 02:15:59,123 bar bar bar
2014-07-01 01:15:59,123 foo
2014-07-01 02:15:59,123 foo
2014-07-01 03:15:59,123 foo
2014-07-01 21:15:59,123 foo
2014-07-01 22:15:59,123 foo
2014-07-01 23:15:59,123 foo

#let's get them
kent$  awk -v d="$(date -d'24 hours ago' +'%F %T,000')" '$1" "$2>=d &&/foo/' f
2014-07-01 21:15:59,123 foo
2014-07-01 22:15:59,123 foo
2014-07-01 23:15:59,123 foo
person Kent    schedule 02.07.2014
comment
обратите внимание, что last 24 hours в моем ответе с точностью до секунд. - person Kent; 02.07.2014
comment
@Jidder Я не проверял, но должно работать. какое сообщение об ошибке вы получили? определить не работает пожалуйста. - person Kent; 02.07.2014
comment
Просто ничего не возвращает, я предполагаю, что это как-то связано с $1" "$2>=d, поскольку это математическое сравнение, но вы используете его для сравнения строк? - person ; 02.07.2014
comment
@Jidder это работает и для строк, если формат yyyy-mm-dd HH:MM:SS. Хорошо, я делаю тест, может быть, я что-то упустил. - person Kent; 02.07.2014
comment
это не имеет значения, это работает, моя ошибка, я оставил &&/YourSearch/, который, очевидно, ничего не соответствовал. По крайней мере, я узнал кое-что о сопоставлении строк :) - person ; 02.07.2014
comment
@Jidder проверьте обновление, я провел тест, и это сработало. - person Kent; 02.07.2014

Полный awk.
Это должно работать.
Преобразует в эпоху, затем проверяет текущее время также в эпохе, это с точностью до секунд.

awk 'NF&&/yoursearch/{split($1,d,"-");split($2,t,":");epoch = mktime(d[1]" "d[2]" "d[3]" "t[1]" "t[2]" "t[3])}(systime()-epoch)<86400{print} ' log
person Community    schedule 02.07.2014