sed 检查 Oracle日志 并输出对应的行号
在护网的时候可能需要定期检查日志文件,特别是日志文件中的错误信息,在 alert 日志中常见的报错一般都是 Error、ORA-、TNS-
为前缀的信息。我们可以利用 sed 工具检索日志文件中的信息,减少重复工作。
可以利用一下语句过滤错误信息:
1
2
3
4
5
## 一般来说 alert 日志的路径为
## ${ORACLE_BASE}/diag/rdbms/${ORACLE_SID}/${ORACLE_SID}/tracle/alert_${ORACLE_SID}.log
## 因为安装的原因,rdbms 下之后路径可能为大小或者小写的 ${ORACLE_SID} ,具体可以进入 rdbms 路径之后选择
## diag 的路径也可以进入实例之后使用 `show parameter diag` 查看
sed -n '/Mon Aug 26 08/,/Mon Aug 26 09/p' alert_xxxx.log | grep -E '^Error|^ORA-|^TNS-'
Mon Aug 26 08
是路径的日志格式,不同的实例环境格式不同,需要根据实际情况替换
1
2
3
4
5
Error 1034 received logging on to the standby
Error 1034 received logging on to the standby
Error 1034 received logging on to the standby
Error 1034 received logging on to the standby
Error 1034 received logging on to the standby
以上信息的的输出可以基本过滤日志的错误信息,要是有行数就更好了,使用 vim/nvim 打开文件的时候可以直接定位到具体的行,检查报错的详细信息。可以利用 sed = filename
实现输出行号。
1
2
3
4
sed -n -e '/Mon Aug 26 08/,/Mon Aug 26 09/p' -e '/Mon Aug 26 08/,/Mon Aug 26 09/=' alert_XXX.log
sed -n -e '/Mon Aug 26 08/,/Mon Aug 26 09/p' -e '/Mon Aug 26 08/,/Mon Aug 26 09/=' alert_XXX.log | grep -A1 -E '^Error|^ORA-|^TNS-'
## 也可以简化
sed -n '/Mon Aug 26 08/,/Mon Aug 26 09/{=;p}' alert_XXX.log | grep -A1 -E '^Error|^ORA-|^TNS-'
输出如下:
1
2
3
4
5
6
Mon Aug 26 08:55:30 2024
3198275
Error 1034 received logging on to the standby
3198276
Mon Aug 26 08:56:30 2024
3198277
因为行号和内容不在同一行,导致 grep
会直接将行号过滤掉。
我们可以优化一下命令,将行号和内容显示在同一行。建议将行号放置在行末,因为错误信息一般会在行首展示关键字,方便查看。
利用 xargs
每次传输三个参数,默认一般使用空格分割,但是我们这里的内容是以行为单位的,所以需要使用 --delimiter
选项来指定分割符了。以三行为一个处理单元,通过 sed
将处理单元的合并为一行就可以实现日志内容和对应的行号在同一行了,方便定位日志中的具体信息。
优化后的命令如下:
1
sed -n -e '/Mon Aug 26 08/,/Mon Aug 26 09/{p;=}' alert_DWHPROD.log | grep -A1 -E '^Error|^ORA-|^TNS-' | xargs -n 3 --delimiter='\n' | sed 's/\n/ /g'
以上处理后的内容基本已经可以定位内容了,如果想格式化或者美观,可以进一步使用 awk、cut、table
处理,这里就不再展示了。
本文由作者按照
CC BY 4.0
进行授权