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