XML 노드 사이의 Grep은 "마스터 노드 세트의 패턴"을 출력합니다.

XML 노드 사이의 Grep은 "마스터 노드 세트의 패턴"을 출력합니다.

이것을 달성할 수 있는 방법이 있는지 궁금합니다. 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>

Grep을 사용하여 999999를 검색하는 경우 내가 원하는 것은 에서 까지 전체 노드 세트를 인쇄하는 것입니다. 그러나 노드의 행 수가 다를 수 있습니다(고정되지 않음). 하나는 5개, 다른 하나는 20개를 가질 수 있으므로 다음과 같은 것을 사용할 수 없습니다. Grep -HrnA10 -B10 "9999999" 이렇게 하면 다른 노드 세트가 인쇄되기 때문입니다. 그리고 뷰 데이터가 엉망입니다.

수천 개의 XML 파일이 있으므로 먼저 파일 찾기를 사용하여 파일을 쿼리하고 처음 30일 동안의 파일만 추출합니다.

예:

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

출력 예, "854789"를 검색하면 다음 출력이 표시될 것으로 예상됩니다.

<Master>
<Node1>Content</Node1>
<Node2>qwerty</Node2>
<Node3>854789</Node3>
<Node4>999999</Node4>
</Master>

답변1

사용해도 괜찮다면 다음을 사용하세요 awk.

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

파일 이름도 출력하려면 다음을 수행하십시오.

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

관련 정보