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

おすすめ記事