다음 형식으로 json 데이터를 얻습니다. use sed
또는 지원되지 않음, awk
솔라리스 상자에서는 지원되지 않음을 선호합니다.jq
grep -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_xs
Perl을 지원하는 모든 시스템에 일반적으로 기본적으로 설치되는 를 사용할 수 있습니다 .
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
합니다 . 음, 이면 두 번째로 구분된 필드를 인쇄합니다 .{
NR
2
NR
2
:
또는 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-output
jq