모든 xml 파일에서 특정 태그에 대한 디렉토리를 반복적으로 검색하고 태그 값을 grep합니다.

모든 xml 파일에서 특정 태그에 대한 디렉토리를 반복적으로 검색하고 태그 값을 grep합니다.

우분투 14.04 신뢰할 수 있는 Tal.

수백 개의 xml 파일을 포함할 수 있고 차례로 많은 xml 파일을 포함할 수 있는 "testmag"라는 디렉토리가 있다고 가정해 보겠습니다. xml 파일의 이름은 모르지만 그 중 하나에 태그가 포함되어 있다는 것은 알고 있습니다 <dbname>....</dbname>.

이제 위 태그가 포함된 파일을 찾고 태그 값을 터미널에 출력으로 제공하려면 어떻게 해야 합니까?

답변1

find다음은 일치하는 항목이 포함된 파일의 파일 이름도 출력하는 솔루션입니다 .

find . -name "*.xml" -exec grep '<dbname>' {} \;             \
                     -exec echo -e {}"\n" \;                 \
                     | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'

설명하다

  1. find . -name "*.xml"현재 디렉터리에서 모든 xml 파일을 재귀적으로 찾습니다.
  2. -exec grep '<dbname>' {} \;각 파일의 검색 패턴<dbname>
  3. -exec echo -e {}"\n" \;echo 파일 이름 + 새 줄 ( -e옵션은 echo 해석을 만듭니다 \n)
  4. | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'sed레이블 사이에 포함된 필드만 인쇄 하는 파이프 출력입니다 <dbname></dbname>.

echo -e ...참고 1: 필요에 따라 새 줄을 추가하거나 줄에 밑줄을 긋는 등 각 파일의 결과가 명확하게 나열되도록 출력 형식을 지정할 수 있습니다 .

.참고 2: 각 파일의 경로는 (예를 들어) ./subfolder1/file.xml. 절대 경로를 원하면 를 선택하세요 find $PWD -name ....

답변2

적절한 XML 파서를 사용하여 XML을 구문 분석합니다.

shopt -s globstar nullglob
for file in **/*.xml; do 
    dbname=$(xmlstarlet sel -t -v '//dbname' "$file")
    [[ -n "$dbname" ]] && printf "%s\t%s\n" "$file" "$dbname"
done

답변3

find다음과 함께 사용 xq:

find testmag -type f -name '*.xml' -exec xq -r '..|(.dbname? // empty)' {} +

*.xml이것은 일치하는 이름을 가진 디렉토리 안이나 아래의 모든 일반 파일을 찾습니다 testmag. 이러한 배치의 경우 해당 문서에서 발견된 xq각 노드의 값을 추출하기 위한 호출이 이루어집니다.dbname

xqjq에서 배포되는 XML과 유사한 파서입니다.yqhttps://kislyuk.github.io/yq/


이 노드가 있는 모든 XML 파일의 파일 이름이 필요합니까?

find testmag -type f -name '*.xml' -exec xq -e '..|(.dbname? // empty)' {} \; -print

...이것은 노드의 값을 추출하는 것보다 약간 느리지만 xq각 파일에 대해 한 번 호출해야 하기 때문입니다.

답변4

XMLS다음 파일이 포함된 디렉터리 가 있다고 가정해 보겠습니다 .

cat XMLS/file1
foo bar <dbname>target</dbname> baz
foo foo

cat XMLS/file2
<name>notarget</name>

나는 다음 명령을 사용할 것이다:

grep -r '<dbname>' XMLS/ | sed 's/.*<dbname>\(.*\)<\/dbname>.*/\1/'
target

보시다시피 태그 내부의 값을 반환합니다 <dbname>. 태그 내의 값이 <name>아닌


재귀 검색 -r플래그.grep

sed문자열에서 값을 제외한 모든 것을 제거합니다 target.

관련 정보