Script Linux Shell para mudar o grep para uma string, então comente 2 linhas acima e 1 abaixo da string encontrada no arquivo

1

Procurando por alguma ajuda nessa tarefa. Eu tentei vários scripts de shell para fazer isso, mas não tenho certeza se estou abordando esse problema direito. Eu tenho um arquivo que contém vários blocos de dados como este:

multipath {

wwid 360000970000195701574533030394530

alias DG_cln_DRPCU04_Oberon_IX_disk59

}

multipath {

wwid 360000970000195701574533030394531

alias DG_cln_DRPCU04_Oberon_IX_disk60
                }

multipath {

wwid 360000970000195701574533030394532

alias DG_cln_DRPCU04_Oberon_IX_disk61

}

multipath {

wwid 360000970000195701574533030394533

alias DG_cln_DRPCU04_Oberon_IX_disk62

}

multipath {

wwid 360000970000195701574533030394534

alias DG_cln_DRPCU04_Oberon_IX_disk63

}

multipath {

wwid 360000970000195701574533030394535

alias DG_cln_DRPCU04_Oberon_IX_disk6

}

multipath {

wwid 360000970000195701574533030394536

alias DG_cln_DRPCU04_Oberon_IX_disk64

}

Eu quero comentar apenas blocos específicos. Eu quero mudar apenas as linhas no bloco que tenho greped para.

Exemplo:

grep -B 2 -A 1 DG_cln_DRPCU04_Oberon.

Ele retornará todos os blocos que contiverem DG_cln_DRPCU04_Oberon. Então quero comentar esse bloco inteiro de 4 linhas, para cada bloco único que é retornado. Existe uma maneira fácil de fazer isso? Obrigado por qualquer sugestão de sugestões sobre como abordar este problema.

    
por Mike Marsh 09.06.2016 / 22:15

1 resposta

0

Você pode fazer isso em awk . Coloque o seguinte script em um arquivo e, em seguida, chame awk -v pattern=disk60 -f script_file data_file :

found { buf = buf "\n" $0 }
/multipath *\{/ { buf = $0; found = 1 }
!found { print }
$0 ~ pattern { matched = 1 }
/\}/ {
    if (matched) {
        gsub(/\n/, "\n#", buf);
        buf = "#" buf;
    }
    print buf "\n";
    buf = "";
    found = matched = 0;
}

Isso funciona da seguinte maneira: Se a linha contiver multipath e uma chave de abertura, inicie um novo buffer e defina a variável found . Contanto que found seja verdadeiro, adicione a linha ao buffer. Se found não for verdadeiro, imprima a linha imediatamente, pois estamos fora de um bloco interessante. Se a linha corresponder ao padrão que você está procurando ( disk60 no meu exemplo), defina a variável matched . Finalmente, se a linha contiver uma chave de fechamento, verifique se matched é true. Se sim, comente as linhas no buffer. Imprima o buffer e redefina as variáveis.

    
por 10.06.2016 / 11:09