JSON 데이터의 Grep 문자열

JSON 데이터의 Grep 문자열

다음 형식으로 json 데이터를 얻습니다. use sed또는 지원되지 않음, awk솔라리스 상자에서는 지원되지 않음을 선호합니다.jqgrep -o

[{"FRUIT":"APPLE","CAR":"FORESTER","COMPANY":"SUBARU","MAKE":"2015","CITY":"UNION CITY","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"1"},{"FRUIT":"MANGO","CAR":"OUTBACK","COMPANY":"SUBARU","MAKE":"2017","CITY":"EDISON","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"2"},{"....."}]

두 번째 열에서 데이터를 추출하려고 합니다.

"FORESTER"
"OUTBACK"

답변1

json_xsPerl을 지원하는 모든 시스템에 일반적으로 기본적으로 설치되는 를 사용할 수 있습니다 .

json_xs -f json -t json-pretty < file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2

또는 Python을 사용하십시오.

python3 -m json.tool file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2

답변2

다음 명령을 시도해 보세요

$ sed "s/{/\n/g" file.txt | awk -F, 'NF>=2{split($2,Arr,":");print Arr[2]}'
"FORESTER"
"OUTBACK"

sed 명령을 사용하여 한 줄을 여러 줄로 나눈 다음 awk를 사용하여 두 번째 열 값을 검색합니다.

답변3

가장 우아한 접근 방식은 아니지만 이는 예제 데이터에 적합합니다.

$ tr , '\n' < file | awk -F: '{if(/\{/){NR=1}}NR==2{print $2}'
"FORESTER"
"OUTBACK"

tr모든 것을 개행 문자로 대체 합니다 ,. awk는 현재 줄 번호가 저장 되고 각 줄에서 자동으로 증가하므로 각 키-값 쌍 세트의 두 번째 줄에만 표시된다는 NR것을 의미 0합니다 . 음, 이면 두 번째로 구분된 필드를 인쇄합니다 .{NR2NR2:


또는 JSON 데이터를 지원하는 적절한 스크립트 언어를 사용하세요. 예를 들면 다음과 같습니다 perl.

$ perl -M"JSON" -lne 'my $json = decode_json($_); 
                      foreach $f (@{$json}){print $f->{"CAR"};}' file
FORESTER
OUTBACK

답변4

이 답변에 사용한 도구는 jq다음에서 다운로드할 수 있습니다.https://stedolan.github.io/jq/(Solaris의 경우에도) 루트 액세스 없이 루트가 아닌 사용자의 홈 디렉토리에 설치됩니다. 또한 런타임 종속성이 전혀 없습니다.


JSON 문서에는 "두 번째 열"이 없습니다. 파일을 다음과 같이 작성할 수도 있습니다.

[
  {
    "FRUIT": "APPLE",
    "CAR": "FORESTER",
    "COMPANY": "SUBARU",
    "MAKE": "2015",
    "CITY": "UNION CITY",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "1"
  },
  {
    "FRUIT": "MANGO",
    "CAR": "OUTBACK",
    "COMPANY": "SUBARU",
    "MAKE": "2017",
    "CITY": "EDISON",
    "STATE": 0,
    "COUNTRY": 0,
    "LOCATION": 0,
    "RANK": "2"
  }
]

추가된 공백은 실제 JSON 데이터에 영향을 주지 않습니다.

key 에 해당하는 모든 항목의 값을 추출하려면 명령줄 JSON 구문 분석기를 CAR사용하세요 .jq

$ jq '.[].CAR' file.json
"FORESTER"
"OUTBACK"

이 표현식은 .[].CAR"최상위 배열의 각 요소에 대해 키 값을 반환합니다 CAR"를 의미합니다.

따옴표 없이 출력하려면 호출 에 -r( 또는 )를 추가하세요. 그러면 디코딩된 데이터가 반환됩니다.--raw-outputjq

관련 정보