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