Encontre o padrão de string no arquivo / entrada, pesquisa dependente do contexto, (não como grep)

3

Existe algum utilitário disponível para encontrar texto, como em grep (linux) ou findstr (dos), mas para começar a procurar somente após outro texto / padrão ser encontrado?

Como tentar encontrar determinado texto / padrão em um arquivo, mas apenas aqueles que estão dentro da seção específica do arquivo. Apenas 'o arquivo' no meu caso é uma saída de outro programa e a quantidade de linhas geradas é muito grande para gravar em um arquivo e analisá-lo lá.

exemplo:

section ONE
  text_a
  text_b
  text_c
section TWO
  text_b
  text_c
section THREE
  . . .

encontre qualquer "text_c" somente na seção TWO.

Eu tentei ler as opções de grep , mas não parece ter essa capacidade. Isso também é esperado para minimizar a quantidade de comparações de strings, já que "text_c" é muito mais longo que os nomes das seções.

    
por sny 02.09.2016 / 00:02

3 respostas

2

Vamos considerar este arquivo de teste:

$ cat file
section ONE
  text_a
  text_b
  text_c  <-ignore this
section TWO
  text_b
  text_c  <-keep this
section THREE
  text_a
  text_b
  text_c  <-ignore this

Para selecionar qualquer linha contendo text_c que esteja em section TWO :

$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
  text_c  <-keep this

Se a entrada for gerada não de um arquivo, mas de command , use:

command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'

Como funciona

  • /^section/{f=0}

    Sempre que encontrarmos uma linha que comece com section , defina f=0 .

  • /^section TWO/{f=1}

    Se a linha começar com section TWO , substitua o comando anterior e defina f=1 .

  • f && /text_c/

    Se f for diferente de zero e a linha atual corresponder a text_c , imprima a linha.

por 02.09.2016 / 00:12
2

Você também pode fazer isso com sed como:

command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'

isso funciona por:

  • -n informa sed para não imprimir linhas correspondentes por padrão
  • -esed um script para trabalhar
    • /section TWO/,/section THREE/ define nosso intervalo de endereços, portanto, aplicaremos a próxima função a todas as linhas entre as linhas que correspondem a section TWO e section THREE
    • { /text_c/p;} define a função que corresponderá a uma linha com text_c e, se for encontrada, p imprimi-la
por 02.09.2016 / 15:16
1

Se o número de linhas que seguem cada seção for um tanto constante, você pode usar a opção '-A x ' no grep para imprimir as linhas x após uma seção correspondente . Isso pode então ser canalizado para um segundo grep que procura pelo seu padrão dentro da 'seção TWO'.

$ cat file
section ONE
  1 text_a
  1 text_b
  1 text_c  
section TWO
  2_text_a
  2 text_b
  2 text_c  
section THREE
  3 text_a
  3 text_b
  3 text_c 

$ grep -A3 'section TWO' file | grep text_c
  2 text_c
    
por 02.09.2016 / 09:17