서버의 백업 파일을 나열하면 다음과 같은 결과가 나타납니다.
{
"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용으로 작성된 도구가 이를 처리할 수 있습니다. 나는 사용한다yq
jq
, 이는 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
당신과 함께 가는 규범적인 방법JSON, 그냥 사용하세요잭, 그러나 여기서는 jq
다음 오류로 인해 실패합니다.
parse error: Expected another array element at line 6, column 5
나는 다른 방법을 사용하고 있습니다JS그리고노드 js:
#!/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