Мне нужно извлечь последние 5 минут из файла журнала. Вот мой файл журнала
[2022-02-08 13:26:21:352] [ERROR] [iBus Connection LifeCycle - CCMHost_DummyDevice_Backup_AD2::Management:::NRMCMO_FLPROD2] [com.example]
+ Message: Could not create an administered connection factory: Java heap space
+ Throwable: java.lang.OutOfMemoryError: Java heap space
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
+ Message: Unable to Initialize Connection
+ Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
+ Message: Unable to Initialize Connection
+ Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-01017, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:05:04:056] [ERROR] [JMS Session Delivery Thread - The user's password has expired.] [com.example]
Я пробовал использовать это, но не работает
awk -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" -v d2="$(date "+%Y-%m-%d %H:%M:%S:%3N")" '$0 > d1 && $0 < d2 || $0 ~ d2' filelog.log
Любая помощь будет оценена по достоинству.
решение1
Это не работало, потому что первый символ в строке журнала — квадратная скобка, и это портит ваше сравнение. Если вы извлечете только часть даты из строки журнала для сравнения, это должно работать. Обратите внимание, что я жестко кодирую даты здесь, чтобы я мог использовать ваши строки примеров.
awk -v d1="2022-02-08 15:04:00" -v d2="2022-02-08 15:08:00" 'd1 < substr($0,2,19) && substr($0,2,19) < d2 || substr($0,2,19) ~ d2' filelog.log
На самом деле вы могли бы упростить свою команду; поскольку вас интересуют только времена, более поздние, чем 2 часа назад, вы могли бы вообще убрать "d2". Если вас интересуют только строки, в которых дата действительно появляется, вы можете предотвратить искусственные совпадения с другими строками, указав, что совпадающие строки должны начинаться с "[", как это делают ваши строки с датой.
awk -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" '/^\[/ && d1 < substr($0,2,19)' filelog.log
Если вас также интересуют дополнительные строки под каждой соответствующей меткой даты, и если между каждой допустимой записью строки действительно есть пустые строки, вы можете использовать это для изменения разделителя записей, чтобы он выбирал дополнительную информацию и отменял проверку «[», поскольку другие строки являются частью той же записи, а не отдельными строками, подлежащими фильтрации.
root@2ec99a4edaa9:/tmp# awk -v RS= -v d1="2022-02-08 15:04:00" 'd1 < substr($0,2,19)' filelog.log
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
+ Message: Unable to Initialize Connection
+ Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:09:37:068] [ERROR] [HikariCP connection filler (pool DirectReadConnection.9c292fc0.210e0ac7)] [com.example]
+ Message: Unable to Initialize Connection
+ Throwable: java.sql.SQLException: Listener refused the connection with the following error:
ORA-01017, TNS:listener does not currently know of SID given in connect descriptor
[2022-02-08 15:05:04:056] [ERROR] [JMS Session Delivery Thread - The user's password has expired.] [com.example]
Наконец, если вы хотите сохранить пустые строки для удобства чтения в выводе, вы можете просто добавить их -v ORS="\n\n"
в свой оператор awk.
В целом ваша измененная команда будет выглядеть так:
awk -v RS= -v ORS="\n\n" -v d1="$(date --date="2 hour ago" "+%Y-%m-%d %H:%M:%S:%3N")" 'd1 < substr($0,2,19)' filelog.log