새로운 json 목록을 형성하려면 파일에서 json 데이터의 특정 필드를 읽어야 합니다. 이 파일은 다음에 의해 생성되었습니다.reading data from multiple servers via pssh
# pssh_result.txt
[1] 14:44:51 [SUCCESS] 1.1.1.1
{"field1":"value11","field2":"value12","field3":"value13",...}
[2] 14:44:51 [SUCCESS] 1.1.1.2
{"field1":"value21","field2":"value22","field3":"value23",...}
...
...
현재는 필드만 추출할 수 있지만 이를 완성된 json 배열로 결합하는 방법을 모르겠습니다.
#!/bin/sh
input="pssh_result.txt"
while IFS= read -r line; do
# echo "$line"
if jq -e . >/dev/null 2>&1 <<<"$line"; then
read field1 field3 <<<$(echo $(echo $line |
jq -r '.field1, .field3'))
example_item=$(jq --null-input \
--arg field1 "$field1" \
--arg field3 "$field3" \
'{"alias1": $field1, "alias2": $field3}')
echo $example_item
fi
done <"$input"
출력은 다음과 같습니다
sh test.sh
{ "alias1": "value11", "alias2": "value13" }
{ "alias1": "value21", "alias2": "value23" }
하지만 나는 원한다병합나중에 처리를 위해 제3자에게 보낼 수 있도록 큰 json 배열에 넣습니다.원하는 결과다음과 같이
[
{
"alias1": "value11",
"alias2": "value13"
},
{
"alias1": "value21",
"alias2": "value23"
}
]
배열에 넣어서 그런 식으로 전달하는 것도 생각해 봤지만 join(arr,",")
예상대로 작동하지 않았습니다.
내가 원하는 결과를 어떻게 얻을 수 있나요? 이에 대한 도움을 주시면 정말 감사하겠습니다.
답변1
입력이 다음과 같다고 가정합니다.
[1] 14:44:51 [SUCCESS] 1.1.1.1
{"field1":"value11","field2":"value12","field3":"value13"}
[2] 14:44:51 [SUCCESS] 1.1.1.2
{"field1":"value21","field2":"value22","field3":"value23"}
(JSON 개체가 포함된 줄에서 깨진 JSON을 수정했습니다.)
...그런 다음 다음을 사용하여 필요한 줄을 추출할 수 있습니다 grep
.
grep '^{' file
또는
grep -v -F '[SUCCESS]' file
또는 이와 유사한 grep
명령.
그런 다음 JSON 객체 스트림 구문 분석을 사용하면 jq -s
자동으로 배열로 읽어올 수 있습니다. 이를 통해 다음과 같이 데이터를 처리할 수 있습니다.
grep '^{' file | jq -s 'map({ alias1: .field1, alias2: .field3 })'
위에 표시된 입력을 사용하면 file
다음이 생성됩니다.
[
{
"alias1": "value11",
"alias2": "value13"
},
{
"alias1": "value21",
"alias2": "value23"
}
]
기존 초기 입력 구문 분석을 변경하는 데 관심이 없고 출력을 배열에 저장하려면 다음을 전달하세요 jq -s .
.
$ cat file
{ "alias1": "value11", "alias2": "value13" }
{ "alias1": "value21", "alias2": "value23" }
$ jq -s . file
[
{
"alias1": "value11",
"alias2": "value13"
},
{
"alias1": "value21",
"alias2": "value23"
}
]
읽어볼 가치가 있는 해커곧장원본 파일의 데이터를 jq
원시 문자열로 읽고 유효한 JSON으로 변환한 후 오류를 삭제합니다.
$ cat file
[1] 14:44:51 [SUCCESS] 1.1.1.1
{"field1":"value11","field2":"value12","field3":"value13"}
[2] 14:44:51 [SUCCESS] 1.1.1.2
{"field1":"value21","field2":"value22","field3":"value23"}
$ jq -R 'fromjson | { alias1: .field1, alias2: .field3 }' file 2>/dev/null
{
"alias1": "value11",
"alias2": "value13"
}
{
"alias1": "value21",
"alias2": "value23"
}
그런 다음 배열로 수집할 수 있습니다.
$ jq -R 'fromjson | { alias1: .field1, alias2: .field3 }' file 2>/dev/null | jq -s .
[
{
"alias1": "value11",
"alias2": "value13"
},
{
"alias1": "value21",
"alias2": "value23"
}
]
jq
첫 번째 jq
호출이 입력을 JSON 및 fromjson
배열(또는 단일 개체가 아닌 다른 구조)로 변환하려고 시도하면 조기에 종료되므로 여기서는 두 개의 별도 호출을 수행해야 합니다 .