![xml을 쉘 스크립트의 매개변수로 구문 분석하는 방법](https://linux55.com/image/128479/xml%EC%9D%84%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
이것은 내 샘플 XML 파일입니다. max_size를 출력으로 가져와야 합니까?
xlimit와 xpath를 사용해 보았지만 둘 다 작동하지 않았습니다.
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
<service_info name="dummyapp" version="5.0"
<object name="WebApplications">
<item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
</object>
<object name="jdbc_oracle_nonxa">
<item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>
답변1
XML이 잘 구성되어 있다고 가정합니다.
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
<service_info name="dummyapp" version="5.0"/>
<object name="WebApplications">
<item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
</object>
<object name="jdbc_oracle_nonxa">
<item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>
</weblogic-service>
(질문에 닫히지 않은 태그는 닫았습니다)
...이 경우 다음이 출력됩니다 25
(이 예의 경우).
xml sel -t -v '//item/@max_size' -nl file.xml
이것은 사용 중입니다XML 스타max_value
모든 노드의 속성값을 가져옵니다 item
. 마지막으로 -nl
출력 뒤에 개행 문자를 삽입하십시오.
item
좀 더 구체적으로 설명하고 노드 내의 노드만 살펴봐야 한다면 다음과 같습니다.object
name
jdbc_oracle_nonxa
xml sel -t -v '//object[@name="jdbc_oracle_nonxa"]/item/@max_size' -nl file.xml
XMLStarlet은 xmlstarlet
설치된 것이 아니라 xml
일부 시스템에 설치된다는 점에 유의하십시오.
사용 xmllint
(출력 끝에 개행 없이):
xmllint --xpath 'string(//object[@name="jdbc_oracle_nonxa"]/item/@max_size)' file.xml
답변2
일반적으로 sed 또는 grep을 사용하는 것이 더 빠르지만 덜 안전합니다.
sed -E -n 's/.*max_size="([0-9]+)".*/\1/p' sample-4.xml
25
또는 grep:
grep -Eo 'max_size="[0-9]+" ' sample-4.xml | grep -Eo "[0-9]+"
25
XML의 유효성을 검사하지 않으며 인식 없이 주석 처리된 코드를 선택할 수 있습니다. 화면을 보고 두 가지 결과를 얻으면 눈치챌 수도 있지만, 자동화된 프로세스에서 이를 사용하면 실수하기 쉽습니다.
때로는 XML을 생성하는 프로그램을 작성하여 다른 원치 않는 컨텍스트에서 주석 또는 max_size="..."를 출력하는지 알 수 있습니다. 이러한 제한 사항을 알고 있다면 sed, grep 또는 awk에 아무런 문제가 없습니다. 단지 아름다운 xmlstarlet 구문을 배우지 못하게 한다는 것뿐입니다. :)