sed 不一致地从日志文件中剥离块
sed not consistently stripping blocks from log file
有一个由 Oracle RMAN 生成的日志文件,我想用 sed 传递它并去除肯定的验证结果。
原始日志文件可以在这里查看:
https://pastebin.com/XhEEs9e9
This log file consists of many sections like this:
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
我想要实现的是让 sed 去除所有损坏块和失败块均为“0”的块。
为了完成这个,我设计了一个相当长的 sed 命令,如下所示:
/tmp/rman.log | /usr/gnu/bin/sed -E '/^File[[:space:]]*Status[[:space:]]*Marked[[:space:]]*Corrupt[[:space:]]*Empty[[:space:]]*Blocks[[:space:]]*Blocks[[:space:]]*Examined[[:space:]]*High SCN$/{N;N;/\n[[:digit:]]*[[:space:]]*OK[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*$/{N;N;N;N;/\n[[:space:]]*Data[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/{N;/\n[[:space:]]*Index[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/{N;/\n[[:space:]]*Other[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/d}}}}'
该命令似乎有效,一些块已从原始日志文件中删除,但仍保留了一些块。
问题是,我不知道为什么...:(
过滤后的日志可以在这里看到:
https://pastebin.com/rKgfj28B
我的命令是不是遗漏了什么?留下的那些对于损坏的块和失败的块也有“0”,但不知何故它们不匹配。
如果您问题中以 File
开头的文本块是 "block" 并且每个块之间有空行,例如:
$ cat file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
那么这就是您所需要的:
$ awk -v RS= -v ORS='\n\n' '( )+0' file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
否则,如果块之间没有空行,那么这就是您所需要的:
$ cat tst.awk
/^File/ { if (NR>1) prt() }
{ rec = rec [=12=] ORS }
END { prt() }
function prt( f) {
split(rec,f)
if ( (f[19] f[36] f[39] f[42])+0 ) {
printf "%s", rec
}
rec = ""
}
例如:
$ cat file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
.
$ cat tst.awk
/^File/ { if (NR>1) prt() }
{ rec = rec [=12=] ORS }
END { prt() }
function prt( f) {
split(rec,f)
if ( (f[19] f[36] f[39] f[42])+0 ) {
printf "%s", rec
}
rec = ""
}
.
$ awk -f tst.awk file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
有一个由 Oracle RMAN 生成的日志文件,我想用 sed 传递它并去除肯定的验证结果。
原始日志文件可以在这里查看: https://pastebin.com/XhEEs9e9
This log file consists of many sections like this:
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
我想要实现的是让 sed 去除所有损坏块和失败块均为“0”的块。
为了完成这个,我设计了一个相当长的 sed 命令,如下所示:
/tmp/rman.log | /usr/gnu/bin/sed -E '/^File[[:space:]]*Status[[:space:]]*Marked[[:space:]]*Corrupt[[:space:]]*Empty[[:space:]]*Blocks[[:space:]]*Blocks[[:space:]]*Examined[[:space:]]*High SCN$/{N;N;/\n[[:digit:]]*[[:space:]]*OK[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*[[:space:]]*[[:digit:]]*$/{N;N;N;N;/\n[[:space:]]*Data[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/{N;/\n[[:space:]]*Index[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/{N;/\n[[:space:]]*Other[[:space:]]*0[[:space:]]*[[:digit:]]*[[:space:]]*$/d}}}}'
该命令似乎有效,一些块已从原始日志文件中删除,但仍保留了一些块。
问题是,我不知道为什么...:(
过滤后的日志可以在这里看到: https://pastebin.com/rKgfj28B
我的命令是不是遗漏了什么?留下的那些对于损坏的块和失败的块也有“0”,但不知何故它们不匹配。
如果您问题中以 File
开头的文本块是 "block" 并且每个块之间有空行,例如:
$ cat file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
那么这就是您所需要的:
$ awk -v RS= -v ORS='\n\n' '( )+0' file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
否则,如果块之间没有空行,那么这就是您所需要的:
$ cat tst.awk
/^File/ { if (NR>1) prt() }
{ rec = rec [=12=] ORS }
END { prt() }
function prt( f) {
split(rec,f)
if ( (f[19] f[36] f[39] f[42])+0 ) {
printf "%s", rec
}
rec = ""
}
例如:
$ cat file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411
.
$ cat tst.awk
/^File/ { if (NR>1) prt() }
{ rec = rec [=12=] ORS }
END { prt() }
function prt( f) {
split(rec,f)
if ( (f[19] f[36] f[39] f[42])+0 ) {
printf "%s", rec
}
rec = ""
}
.
$ awk -f tst.awk file
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 3 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 0 232975
Other 0 716411
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
58 OK 0 7964 1280000 8964120502
File Name: /oracle/PRD/sapdata3/sr3_55/sr3.data55
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 322650
Index 1 232975
Other 0 716411