【问题标题】:Using jq to fetch and show key value with quotes使用 jq 获取并显示带引号的键值
【发布时间】:2021-11-19 13:28:22
【问题描述】:

我有一个如下所示的文件:

{
    "Job": {
        "Name": "sample_job",
        "Description": "",
        "Role": "arn:aws:iam::00000000000:role/sample_role",
        "CreatedOn": "2021-10-21T23:35:23.660000-03:00",
        "LastModifiedOn": "2021-10-21T23:45:41.771000-03:00",
        "ExecutionProperty": {
            "MaxConcurrentRuns": 1
        },
        "Command": {
            "Name": "glueetl",
            "ScriptLocation": "s3://aws-sample-s3/scripts/sample.py",
            "PythonVersion": "3"
        },
        "DefaultArguments": {
            "--TempDir": "s3://aws-sample-s3/temporary/",
            "--class": "GlueApp",
            "--enable-continuous-cloudwatch-log": "true",
            "--enable-glue-datacatalog": "true",
            "--enable-metrics": "true",
            "--enable-spark-ui": "true",
            "--job-bookmark-option": "job-bookmark-enable",
            "--job-insights-byo-rules": "",
            "--job-language": "python",
            "--spark-event-logs-path": "s3://aws-sample-s3/logs"
        },
        "MaxRetries": 0,
        "AllocatedCapacity": 100,
        "Timeout": 2880,
        "MaxCapacity": 100.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 100,
        "GlueVersion": "2.0"
    }
}

我想从"Name""--enable-continuous-cloudwatch-log": """--enable-metrics": "" 获取键/值。所以,我需要显示这样的信息:

"Name" "sample_job"
"--enable-continuous-cloudwatch-log" ""
"--enable-metrics" ""

UPDATE

按照@Inian 和@0stone0 的提示,我接近了它:

jq -r '(.Job ) + (.Job.DefaultArguments | { "--enable-continuous-cloudwatch-log", "--enable-metrics"}) | to_entries[] | "\"\(.key)\" \"\(.value)\""'

这会提取我需要的值,但会显示所有其他键/值。

【问题讨论】:

  • 您的 JSOn 无效。请修复它
  • 这是一个来自AWS的JSON,我只是剪了几行
  • 缺少一个右括号,请显示正确的数据顺序。 DefaultArgumentsJob 的一部分吗?请确保 linter 理解你的 json
  • 这是来自 AWS Glue 作业的 sn-p,我使用 aws glue get-job --job-name sample_job 获取 JSON。而且,是的DefaultArgumentsJob的一部分。
  • 不确定我现在删除的答案中的 cmets 是什么意思。我根据您提供的输入发布了答案。如果你在不同的 JSON 上测试它,它就不能工作

标签: json jq


【解决方案1】:

由于您的 JSON 无效,我已将其转换为:

{
    "Job": {
        "Name": "sample_job",
        "Role": "sample_role_job"
    },
    "DefaultArguments": {
        "--enable-continuous-cloudwatch-log": "test_1",
        "--enable-metrics": ""
    },
    "Timeout": 2880,
    "NumberOfWorkers": 10
}

使用以下过滤器:

"Name \(.Job.Name)\n--enable-continuous-cloudwatch-log \(.DefaultArguments."--enable-continuous-cloudwatch-log")\n--enable-metrics \(.DefaultArguments."--enable-metrics")"

我们使用字符串插值来显示所需的输出:

Name sample_job
--enable-continuous-cloudwatch-log test_1
--enable-metrics 
jq --raw-output '"Name \(.Job.Name)\n--enable-continuous-cloudwatch-log \(.DefaultArguments."--enable-continuous-cloudwatch-log")\n--enable-metrics \(.DefaultArguments."--enable-metrics")"'

Online Demo

【讨论】:

  • OP 想要同时引用键和值
  • 嗨 Ostone0,谢谢。引号没有问题,但没有工作:cat file.json | jq -r '"Name \(.Job.Name)\n--enable-continuous-cloudwatch-log \(.DefaultArguments."--enable-continuous-cloudwatch-log")\n--enable-metrics \(.DefaultArguments."--enable-metrics")"' >>> 所有具有类似 "--enable-metrics" "true" 值的作业输出为 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多