우분투 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'
설명하다
find . -name "*.xml"
현재 디렉터리에서 모든 xml 파일을 재귀적으로 찾습니다.-exec grep '<dbname>' {} \;
각 파일의 검색 패턴<dbname>
-exec echo -e {}"\n" \;
echo 파일 이름 + 새 줄 (-e
옵션은 echo 해석을 만듭니다\n
)| 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
xq
jq
에서 배포되는 XML과 유사한 파서입니다.yq
https://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
.