쉘에서 여러 json 객체를 json 배열로 병합하는 방법

쉘에서 여러 json 객체를 json 배열로 병합하는 방법

새로운 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배열(또는 단일 개체가 아닌 다른 구조)로 변환하려고 시도하면 조기에 종료되므로 여기서는 두 개의 별도 호출을 수행해야 합니다 .

관련 정보