Como aplicar padrões não consecutivos ao grep

1

Como aplicar padrões não consecutivos ao grep ...

Eu corro este comando.

grep -B 1 -A 2 "field-2-value" inputFile.txt |grep -v "field-3"

que produz essas 4 saídas.

  [field-1]xxx[/field-1] 
  [field-2]field-2-value[/field-2] 
  [field-5]true[/field-5] 
  -- 
  [field-1]yyy[/field-1] 
  [field-2]field-2-value[/field-2] 
  [field-4]field-4-value[/field-4] 
  -- 
  [field-1]zzz[/field-1] 
  [field-2]field-2-value[/field-2] 
  [field-5]false[/field-5] 
  -- 
  [field-1]mmm[/field-1] 
  [field-2]field-2-value[/field-2] 
  [field-4]field-4-value[/field-4]

Estou interessado apenas no 2º e último resultados com valores de campo 2 e 4:

 
  [field-1]yyy[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]

  [field-1]mmm[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]

O inputFile.txt se parece com isto:

[RECORD id="1"]
  [field-1]xxx[/field-1]
  [field-2]field-2-value[/field-2]
  [field-3]hello[/field-3]
  [field-5]true[/field-5]
[/RECORD]
[RECORD id="2"]
  [field-1]yyy[/field-1]
  [field-2]field-2-value[/field-2]
  [field-3]hello[/field-3]
  [field-4]field-4-value[/field-4]
[/RECORD]
[RECORD id="3"]
  [field-1]zzz[/field-1]
  [field-2]field-2-value[/field-2]
  [field-3]hello[/field-3]
  [field-5]false[/field-5]
[/RECORD]
[RECORD id="4"]
  [field-1]mmm[/field-1]
  [field-2]field-2-value[/field-2]
  [field-3]hello[/field-3]
  [field-4]field-4-value[/field-4]
[/RECORD]

Estou quase tentado a escrever um script de shell para executar dois conjuntos de operações: Primeiro, gere um arquivo que tenha essas saídas para cada arquivo que contenha esses resultados. E então remova o bloco de linhas que não possuem o campo-4. Socorro!

    
por Joy Kola 11.08.2017 / 18:06

1 resposta

0

sed -ne '
   /field-2-value/!{h;d;}
   H;n;n;/field-4/!d;H;g;s/$/\n/p
' inputFile.txt

Estamos rejeitando todas as linhas que não contêm / field-2 /, mas armazenando-as em espera. (Apenas o último pode ser salvo)

Então, quando vemos / field-2 / line, nós o adicionamos para manter, pular a próxima linha, e então verificar se a próxima linha para a próxima contém / field-4 /. Se não o deixarmos cair, nós o adicionamos para segurar, depois trarmos o porão e imprimi-lo depois de adicionar uma nova linha à direita, para separar os registros impressos.

Resultados:

  [field-1]yyy[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]

  [field-1]mmm[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]
    
por 11.08.2017 / 18:25