Saída de Grep entre nós XML “Padrão dentro do conjunto de nós principais”

1

Eu estou querendo saber se existe alguma maneira de conseguir isso. Formato XML:

<Main>
<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>854789</Node3>
<Node4>999999</Node4>
</Master>
<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>123456</Node3>
<Node4>999999</Node4>
<Node5>qwerty</Node5>
<Node6>123456</Node6>
<Node7>999999</Node7>
</Master>
<Master>
</Master>
<Master>
</Main>

Se eu usar o Grep para pesquisar 999999 O que eu gostaria, é o Nó todo definido de para ser impresso. Mas os Nodos podem ter diferentes números de linhas (Não é fixo) Um poderia ter 5 o outro poderia ter 20 Então eu não posso usar algo como: Grep -HrnA10 -B10 "9999999" Como isso acabaria imprimindo outros conjuntos de nós e tornando a visualização dos dados confusa.

Eu tenho milhares de arquivos XML, portanto, estou consultando os arquivos primeiro com o recurso de localizar apenas os primeiros 30 dias de arquivos.

exemplo:

find . -name "*.xml" -type f -mtime -30 -exec grep --colour=always -HrnA13 -B20 -E 'Pattern' {} \;

Um exemplo da saída, se eu procurei por "854789" Eu gostaria de ver esta saída:

<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>854789</Node3>
<Node4>999999</Node4>
</Master>
    
por Dave Hamilton 19.10.2016 / 11:00

1 resposta

1

Se você não se importa em usar awk :

find -name '*.xml' -type f -exec awk 'BEGIN{RS="</Master>"}/999999/' {} \;

Se você quiser que o nome do arquivo seja enviado também:

find -name '*.xml' -type f -exec awk 'BEGIN{RS="</Master>"}/999999/' {} \; -exec echo -e {}"\n" \;
    
por 19.10.2016 / 11:28

Tags