如何使用Linux grep/AWK过滤Oracle迁移日志,保留指定错误及失败SQL块
Oracle迁移日志筛选:提取指定错误及SQL块
方法1:使用grep快速匹配单行内容
如果目标错误和SQL块都是单行格式,直接用扩展正则匹配两种目标模式,同时可按需排除已知错误:
仅提取目标内容
grep -E 'ORA-123|Failing sql:.*CONVERSION \(".*_OWNER"\."[^"]+" & .*_OWNER\)' 你的日志文件名.log > 筛选结果文件名.log
排除已知错误后提取
若需先排除其他已知错误(比如ORA-456、ORA-789),可叠加-v参数实现反向过滤:
grep -vE 'ORA-456|ORA-789' 你的日志文件名.log | grep -E 'ORA-123|Failing sql:.*CONVERSION \(".*_OWNER"\."[^"]+" & .*_OWNER\)' > 筛选结果文件名.log
参数说明:
-E:启用扩展正则表达式,支持用|分隔多个匹配模式-v:反向匹配,排除符合指定模式的行- 正则中的
\(、\)、\"是对特殊字符的转义,确保精准匹配日志中的原格式
方法2:使用AWK处理多行SQL块
如果失败SQL块是多行内容(比如Failing sql:开头后,后续行包含完整SQL细节),AWK能更灵活地捕获上下文内容:
awk ' # 匹配ORA-123错误,直接打印该行 /ORA-123/ {print; next} # 匹配目标格式的失败SQL块起始行 /Failing sql:.*CONVERSION \(".*_OWNER"\."[^"]+" & .*_OWNER\)/ { print $0 # 捕获后续行,直到遇到空行(可根据实际日志调整结束条件,比如/^END SQL$/) while (getline > 0) { print $0 if ($0 ~ /^$/) break } } ' 你的日志文件名.log > 筛选结果文件名.log
脚本说明:
- 第一分支直接匹配并打印
ORA-123错误行 - 第二分支匹配目标SQL块的起始行后,循环读取并打印后续行,直到触发结束条件(示例为空行),可根据实际日志的SQL块结束标记修改判断逻辑
内容的提问来源于stack exchange,提问作者Damon
相关产品推荐
相关产品推荐

