비표준 Json을 구문 분석하는 방법은 무엇입니까?

비표준 Json을 구문 분석하는 방법은 무엇입니까?

데이터를 검색하는 데 사용합니다 curl. 출력은 Json 출력이지만 표준은 아닙니다. 사용해 보았지만 jq빈 출력이 나타납니다. 예를 들어:

이 출력에서 ​​모든 ID를 추출하여 배열에 저장하고 싶습니다.

  {"jsonrpc":"3","result":[{"hostid":"16729"},{"hostid":"16736"},{"hostid":"16731"},{"hostid":"16732"},{"hostid":"16733"},{"hostid":"16734"},{"hostid":"16735"},{"hostid":"16736"},{"hostid":"16738"},{"hostid":"16739"},{"hostid":"16746"},{"hostid":"16741"},{"hostid":"16742"},{"hostid":"16743"},{"hostid":"16744"},{"hostid":"16745"},{"hostid":"16746"},{"hostid":"16747"},{"hostid":"16748"},{"hostid":"16749"},{"hostid":"16756"},{"hostid":"16751"},{"hostid":"16752"},{"hostid":"16753"},{"hostid":"16754"},{"hostid":"16755"},{"hostid":"16756"},{"hostid":"16757"},{"hostid":"16758"},{"hostid":"16759"},{"hostid":"16766"},{"hostid":"16761"},{"hostid":"16762"},{"hostid":"16763"},{"hostid":"16764"},{"hostid":"16765"},{"hostid":"16766"},{"hostid":"16767"},{"hostid":"16768"},{"hostid":"16769"},{"hostid":"16776"},{"hostid":"16771"},{"hostid":"16772"},{"hostid":"16773"},{"hostid":"16774"},{"hostid":"16775"},{"hostid":"16776"},{"hostid":"16777"},{"hostid":"16778"},{"hostid":"16779"},{"hostid":"16786"},{"hostid":"16781"},{"hostid":"16782"},{"hostid":"16783"},{"hostid":"16784"},{"hostid":"16785"},{"hostid":"16786"},{"hostid":"16787"},{"hostid":"16788"},{"hostid":"16789"},{"hostid":"16796"},{"hostid":"16791"},{"hostid":"16792"},{"hostid":"16793"},{"hostid":"16794"},{"hostid":"16795"},{"hostid":"16796"},{"hostid":"16797"},{"hostid":"16798"},{"hostid":"16799"},{"hostid":"16866"},{"hostid":"16861"},{"hostid":"16862"},{"hostid":"16863"},{"hostid":"16864"},{"hostid":"16865"},{"hostid":"16866"},{"hostid":"16867"},{"hostid":"16868"},{"hostid":"16869"},{"hostid":"16816"},{"hostid":"16811"},{"hostid":"16812"},{"hostid":"16813"},{"hostid":"16814"},{"hostid":"16815"},{"hostid":"16816"},{"hostid":"16817"},{"hostid":"16818"},{"hostid":"16819"},{"hostid":"16826"},{"hostid":"16821"},{"hostid":"16825"},{"hostid":"16826"},{"hostid":"16827"},{"hostid":"16828"},{"hostid":"16829"},{"hostid":"16836"},{"hostid":"16831"},{"hostid":"11572"},{"hostid":"11573"},{"hostid":"11575"},{"hostid":"11576"},{"hostid":"11586"},{"hostid":"11629"},{"hostid":"11636"},{"hostid":"11632"},{"hostid":"11634"},{"hostid":"11736"},{"hostid":"11737"}],"id":1}  

나는 다음과 같은 결과를 기대합니다.

  ( 16732 16733 ... 11737 )  

Python을 사용해도 올바른 결과가 나오지 않습니다. 계속 jsonrpc를 반환합니다. 예를 들어:

이 출력에서 ​​IP 값을 추출하고 싶습니다.

  {"jsonrpc":"3","result":[{"interfaceid":"400","hostid":"16796","main":"3","type":"3","useip":"3","ip":"192.168.23.43","dns":"","port":"100","details":[]}],"id":1}

그것은 단지 긴 연결된 문자열일 뿐입니다. 또는 같은 다른 명령을 사용하여 sed원하는 효과를 얻을 수 있는 방법이 있습니까 awk?

답변1

JSON 문서에는 비표준적인 내용이 없습니다. 둘 다 완전히 유효하고 올바른 형식의 JSON 문서이며 JSON 인식 라이브러리 또는 명령줄 도구를 사용하여 쿼리할 수 있습니다. 여기의 예에서는 jq명령줄을 사용하고 있습니다.

jq모든 값을 배열 hostid에 저장 하려면 :bash

readarray -t hostid_values < <( jq -r '.result[].hostid' file.json )

이렇게 하면 hostidJSON 문서의 배열에서 모든 값을 추출하여 읽습니다. 배열에 있는 기존 값은 모두 제거됩니다.resulthostid_valuesbash

마찬가지로 두 번째 JSON 문서의 값을 ip배열 ip_values로 읽어옵니다 bash.

readarray -t ip_values < <( jq -r '.result[].ip' file.json )

두 쉘 코드 모두 값에 새 줄이나 null이 포함되어 있지 않다고 가정합니다.


값에 개행 문자를 삽입한 후 다음과 같은 것을 시도해 볼 수 있습니다.

unset -v hostid_values
eval "$( jq -r '@sh "hostid_values+=( \(.result[].hostid | tonumber) )"' file.json )"

jq이는 배열에 대한 할당문을 만드는 데 사용됩니다 hostid_values. 그런 다음 쉘은 이러한 지정문을 평가합니다. 이 tonumber호출은 숫자가 포함된 문자열 대신 명령 배열을 전송하여 악성 문서가 스크립트에 코드를 삽입할 수 없도록 보장합니다(이런 경우 오류가 발생합니다).

ip두 번째 문서의 값 도 마찬가지입니다 .

unset -v hostid_values
eval "$( jq -r '@sh "ip_values+=( \(.result[].ip | tostring) )"' file.json )"

답변2

데이터가 포함된 배열을 만들려면 sed다음 명령을 시도해 보세요.

array=($(sed 's/{"hostid":"\([0-9]*\)"},/\1 /g;s/{.*\[//;s/{.*:"\(.*\)"}/\1/;s/\].*//' input_file))

IP를 추출하려면 다음을 시도해 보십시오.sed

ip=$(sed 's/.*"ip":"\(.[^"]*\).*/\1/' iput_file)

산출

echo ${array[@]}
16729 16736 16731 16732 16733 16734 16735 16736 16738 16739 16746 16741 16742 16743 16744 16745 16746 16747 16748 16749 16756 16751 16752 16753 16754 16755 16756 16757 16758 16759 16766 16761 16762 16763 16764 16765 16766 16767 16768 16769 16776 16771 16772 16773 16774 16775 16776 16777 16778 16779 16786 16781 16782 16783 16784 16785 16786 16787 16788 16789 16796 16791 16792 16793 16794 16795 16796 16797 16798 16799 16866 16861 16862 16863 16864 16865 16866 16867 16868 16869 16816 16811 16812 16813 16814 16815 16816 16817 16818 16819 16826 16821 16825 16826 16827 16828 16829 16836 16831 11572 11573 11575 11576 11586 11629 11636 11632 11634 11736 11737
$ echo $ip
192.168.23.43

관련 정보