0

我正在尝试修改脚本以自动生成 lightsail 快照,但在修改 jq 查询时遇到了问题。

我正在尝试解析的输出aws lightsail get-instance-snapshots

这是脚本的原始行:

aws lightsail get-instance-snapshots | jq '.[] | sort_by(.createdAt) | select(.[0].fromInstanceName == "WordPress-Test-Instance") | .[].name'

它返回一个快照名称列表,每行一个。

我需要修改查询,以便不返回所有快照,而只返回名称以“autosnap”开头的快照。我这样做是因为脚本会旋转快照,但我不希望它删除我手动创建的快照(不会以“autosnap”开头)。

这是一个经过编辑的示例输出aws lightsail get-instance-snapshots

{
    "instanceSnapshots": [
        {
            "location": {
                "availabilityZone": "all",
                "regionName": "*****"
            },
            "arn": "*****",
            "fromBlueprintId": "wordpress_4_9_2_1",
            "name": "autosnap-WordPress-Test-Instance-2018-04-16_01.46",
            "fromInstanceName": "WordPress-Test-Instance",
            "fromBundleId": "nano_1_2",
            "supportCode": "*****",
            "sizeInGb": 20,
            "createdAt": 1523843190.117,
            "fromAttachedDisks": [],
            "fromInstanceArn": "*****",
            "resourceType": "InstanceSnapshot",
            "state": "available"
        },
        {
            "location": {
                "availabilityZone": "all",
                "regionName": "*****"
            },
            "arn": "*****",
            "fromBlueprintId": "wordpress_4_9_2_1",
            "name": "Premanent-WordPress-Test-Instance-2018-04-16_01.40",
            "fromInstanceName": "WordPress-Test-Instance",
            "fromBundleId": "nano_1_2",
            "supportCode": "*****",
            "sizeInGb": 20,
            "createdAt": 1523842851.69,
            "fromAttachedDisks": [],
            "fromInstanceArn": "*****",
            "resourceType": "InstanceSnapshot",
            "state": "available"
        }
    ]
}

我本以为这样的事情会奏效,但经过多次尝试后我没有任何运气......

aws lightsail get-instance-snapshots | jq '.[] | sort_by(.createdAt) | select(.[0].fromInstanceName == "WordPress-Test-Instance") | select(.[0].name | test("autosnap")) |.[].name'

任何帮助将不胜感激!

4

1 回答 1

0

进行您描述的选择的基本查询将是:

.instanceSnapshots | map(select(.name|startswith("autosnap")))

(如果您不需要保留数组结构,则可以使用:

.instanceSnapshots[] | select(.name|startswith("autosnap"))

)

然后,您可以通过扩展管道来执行额外的过滤。

如果您要使用test/1,则适当的调用可能test("^autosnap")test("^autosnap-").

例子

.instanceSnapshots
| map(select(.name|startswith("autosnap")))
| map(select(.fromInstanceName == "WordPress-Test-Instance"))
| sort_by(.createdAt)
| .[].name

两个连续select的 s 当然可以合并为一个。为提高效率,分类应尽可能晚进行。

后记

尽管您可能确实可以使用.[]而不是开始管道.instanceSnapshots,但如果 JSON 模式发生更改,建议使用后者。从某种意义上说,像 JSON 这样的数据格式的全部意义在于让编写在(健全的)模式演化方面稳健的查询变得容易。

于 2018-04-16T06:39:18.240 回答