Shell 如何从db2错误日志中grep下面的sql部分

Shell 如何从db2错误日志中grep下面的sql部分,shell,awk,sed,grep,aix,Shell,Awk,Sed,Grep,Aix,我有一个从db2diag.log中提取错误消息的脚本。我必须从下面的文件中提取导致死锁的SQL查询 文件内容:log.txt db2inst1 , WSCOMUSR , MESSAGE : ADM5501I DB2 is performing lock escalation. The affected application is named "db2jcc_application", and is associated with the workload

我有一个从db2diag.log中提取错误消息的脚本。我必须从下面的文件中提取导致死锁的SQL查询

文件内容:
log.txt

db2inst1 , WSCOMUSR , MESSAGE : ADM5501I  DB2 is performing lock escalation. The affected application 
          is named "db2jcc_application", and is associated with the workload 
          name "SYSDEFAULTUSERWORKLOAD" and application ID 
          "173.10.105.33.59586.13011817552"  at member "0". The total number of 
          locks currently held is "1249935", and the target number of locks to 
          hold is "624967". The current statement being executed is "delete 
           from DMEXPLOG where CREATED < ? ". Reason code "1"


db2inst1 , WSCOMUSR , MESSAGE : ADM5501I  DB2 is performing lock escalation. The affected application 
          is named "db2jcc_application", and is associated with the workload 
          name "SYSDEFAULTUSERWORKLOAD" and application ID 
          "173.10.105.33.59586.13011817552"  at member "0". The total number of 
          locks currently held is "1249935", and the target number of locks to 
          hold is "624967". The current statement being executed is "select 
          * from DMEXPLOG where CREATED < ?". Reason code "1"
db2inst1,WSCOMUSR,消息:ADM5501I DB2正在执行锁升级。受影响的应用程序
名为“db2jcc_应用程序”,并与工作负载关联
名称“SYSDEFAULTUSERWORKLOAD”和应用程序ID
成员“0”处的“173.10.105.33.59586.13011817552”。总数
当前持有的锁数为“1249935”,目标持有的锁数为
等待是“624967”。正在执行的当前语句是“delete”
从创建的DMEXPLOG开始<?”。原因代码“1”
db2inst1,WSCOMUSR,消息:ADM5501I DB2正在执行锁升级。受影响的应用程序
名为“db2jcc_应用程序”,并与工作负载关联
名称“SYSDEFAULTUSERWORKLOAD”和应用程序ID
成员“0”处的“173.10.105.33.59586.13011817552”。总数
当前持有的锁数为“1249935”,目标持有的锁数为
等待是“624967”。正在执行的当前语句是“select”
*从创建的DMEXPLOG开始<?”。原因代码“1”
所需输出:所有sql查询

1. delete 
           from DMEXPLOG where CREATED < ?
2. select 
          * from DMEXPLOG where CREATED < ?
1。删除
从创建位置的DMEXPLOG<?
2.挑选
*从创建位置的DMEXPLOG<?
像这样。我想要文件中的所有sql部分。是否有任何
grep
或Awk/
sed
解决方案可以获得所需的输出

平台:Unix(AIX)

awk'{gsub(/^..*)正在执行的当前语句是\“| \”。原因代码。*$/,”;打印编号“$0}”log.txt
1.从创建的DMEXPLOG中删除<?
2.
3.从创建的DMEXPLOG中选择*?
毫无疑问,匹配的字符串可以更短,也可以是2。是空的,因为您显示的数据在实际数据之间有一条空行。实际数据中是否有空行?

也许,这对您有所帮助

 user@host:/tmp$ sed -n '/select/,/^$/p;/delete/,/^$/p;/insert/,/^$/p;/update/,/^$/p' log.txt | sed -n '/^[0-9]/!H;//x;$x;s/\n\([^A]\)/ \1/gp' | awk -F'"' '{printf("%d.\t %s\n", NR, $4)}'
1.   delete             from DMEXPLOG where CREATED < ? 
2.   select            * from DMEXPLOG where CREATED < ?
user@host:/tmp$sed-n'/select/,/^$/p/删除/,/^$/p/插入/,/^$/p/更新/,/^$/p'log.txt | sed-n'/^[0-9]/!H//x$x;s/\n \([^A]\)/\1/gp'| awk-F''{printf(“%d.\t%s\n”,NR,$4)}'
1.从创建的DMEXPLOG中删除<?
2.从创建的DMEXPLOG中选择*?

您当前的示例可以用

sed -n '/statement being executed/ s/.*"//p; /Reason code/ s/".*//p'  log
sed -n '/statement being executed/ s/.*"//p; /Reason code/ s/".*//p'  log