Сед не последовательно удаляет блоки из файла журнала - PullRequest
0 голосов
/ 28 марта 2019

Существует файл журнала, сгенерированный 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 для поврежденных блоков и блоков с ошибками, но почему-то они просто не совпадают.

1 Ответ

1 голос
/ 28 марта 2019

Если этот блок текста, начинающийся с File в вашем вопросе, является «блоком» и между каждым блоком есть пустые строки, например ::

$ 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' '($19 $36 $39 $42)+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 $0 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 $0 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
...