Print whole Block se várias strings forem encontradas dentro de Start - End

0

Meu arquivo de registro bruto semelhante ao log de produção que eu ajustei,

Block f1
PCO Blockf1
tray:school       SAM :XP 
        X/Y       DUPL
   KEY  Z/Z
Block f2
PCO Blockf2
tray:school       SAM :XP 
        D/D       DUPL
    KEY D/D
Block f3
PCO Blockf3
tray:school       SAM :AP 
        X/Y       DUPL
   KEY  Z/Z

-----cont.. more than 800 records

resultado esperado com filtros aplicados da seguinte forma: condição1: Se o SAM: XP for encontrado com Z / Z acima de X / Y (FYI ... Z / Z acima da linha contém X / Y), então imprima assim

Block f1
PCO Blockf1
tray:school       SAM :XP 
        X/Y       DUPL
   KEY  Z/Z

condição2: SE SAM: XP é encontrado com D / D acima de D / D (FYI ... D / D acima da linha contém D / D) e depois imprime

Block f2
PCO Blockf2
tray:school       SAM :XP 
        D/D       DUPL
    KEY D/D

como estes, ele percorre 800 registros e imprime esses resultados em junk.txt. NOTA: As linhas podem diminuir ou aumentar Aqui o Block é tratado como começando e terminando, entre o PCO BlockXX está lá, o script não deve considerar que o bloco ignora isso.

Obrigado por ter tentado até agora awk 'BEGIN {RS="Bloco \ n"; ORS = RS} $ 0 == "" || / KEY: ZZ / & & / XY / {print} 'raw.txt > > junk.txt.

I am using HP-UX

    
por chandu 28.02.2017 / 08:15

2 respostas

1

Tarefa quase standart para sed

sed '
    /^Block/! D
    :1
    N
    $!{
       /\n\s*KEY/! b1
    }
    \%SAM.*D/D.*D/D\|SAM.*X/Y.*Z/Z%! d
    ' log

produzir

Block f1
PCO Blockf1
tray:school       SAM :XP 
        X/Y       DUPL
   KEY  Z/Z
Block f2
PCO Blockf2
tray:school       SAM :XP 
        D/D       DUPL
    KEY D/D
Block f3
PCO Blockf3
tray:school       SAM :AP 
        X/Y       DUPL
   KEY  Z/Z
    
por 28.02.2017 / 09:16
0
sed -e '
  /^Block/,/[ ]KEY[ ]/!d;           # reject noninteresting data
  H; /^Block/h; /[ ]KEY[ ]/!d;      # stuff block in hold space
  g;                                # retrieve block when block ends
  /SAM[ ]*:XP\n/!d;                 # filter out block since no SAM XP
  /\n[ ]*KEY[ ]*\([DZ]\)\/$/!d;   # filter out block since no key D/D|Z/Z
  n;p;s/^/\n/;D;                    # print block, print next line, go back
' yourfile

Ouput

Block f1
PCO Blockf1
    tray:school       SAM :XP
    X/Y       DUPL
    KEY  Z/Z
Block f2
Block f2
PCO Blockf2
    tray:school       SAM :XP
    D/D       DUPL
    KEY D/D
Block f3
    
por 28.02.2017 / 10:49