Shell의 손상된 JSON 출력에서 ​​값 추출

Shell의 손상된 JSON 출력에서 ​​값 추출

서버의 백업 파일을 나열하면 다음과 같은 결과가 나타납니다.

{
    "backupFiles": [
        "XYZ_Backup_2.0.0.0-417_2022_08_14_12_10.gz",
        "XYZ_Backup_2.0.0.0-417_2022_08_13_11_20.gz",
        "XYZ_Backup_2.0.0.0-417_2022_08_13_15_11.gz",
    ],
    "total": 3
}

출력을 변수에 저장합니다. 이제 파일 이름만 어떻게 얻을 수 있습니까?

XYZ_Backup_2.0.0.0-417_2022_08_14_12_10.gz

답변1

이것은 실제로 손상된 JSON이지만 (적어도 내가 알 수 있는 한) 유효한 YAML입니다(대부분 JSON의 상위 집합이므로 무엇이 유효한지 또는 유효하지 않은지 말하기 어렵습니다. 그렇지 않기를 바랍니다.).

따라서 YAML용으로 작성된 도구가 이를 처리할 수 있습니다. 나는 사용한다yqjq, 이는 YAML을 유효한 JSON으로 동적으로 변환하는 래퍼일 뿐입니다 . 따라서 당신이 할 수 있는 모든 것을 jq할 수 있습니다. yq당신의 경우에는

<yamldata.txt yq '.backupFiles []'

당신을 위한

"XYZ_Backup_2.0.0.0-417_2022_08_14_12_10.gz"
"XYZ_Backup_2.0.0.0-417_2022_08_13_11_20.gz"
"XYZ_Backup_2.0.0.0-417_2022_08_13_15_11.gz"

첫 번째 것만 원한다면,

<yamldata.txt yq '.backupFiles[0]'

인쇄

"XYZ_Backup_2.0.0.0-417_2022_08_14_12_10.gz"

따옴표가 유용한 경우가 많지만 이를 제거하려면 를 "사용하세요 --raw-output.

답변2

당신과 함께 가는 규범적인 방법, 그냥 사용하세요, 그러나 여기서는 jq다음 오류로 인해 실패합니다.

parse error: Expected another array element at line 6, column 5

나는 다른 방법을 사용하고 있습니다그리고:

#!/bin/bash

node<<EOF
let json = $(< file.json)
console.log(json["backupFiles"][0])
EOF

또는 간단하게:

node -pe 'JSON.parse(process.argv[1]).backupFiles[0]' "$(cat file.json)"

JSON구조가 좋다 면 .

산출:

XYZ_Backup_2.0.0.0-417_2022_08_14_12_10.gz    

관련 정보