【问题标题】:How can I transform lines of values for jq to JSON output? [closed]如何将 jq 的值行转换为 JSON 输出? [关闭]
【发布时间】:2020-10-30 00:39:02
【问题描述】:

我有这个从我的网络服务器获取顶级 IP。试图返回在底部看到的 JSON 对象。是否可以轻松地将行转换为 jq 创建字符串数组所需的格式?

ips=$(cat /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -n 5 | cut -d' ' -f8)

结果:

192.168.1.2
192.168.1.3
192.168.1.5
192.168.1.6
192.168.1.7

我的预期输出是:

"192.168.1.2" "192.168.1.3" "192.168.1.5" "192.168.1.6" "192.168.1.7"

我可能会有很长的路要走。我所拥有的是这个输出进入一个带有其他值的 json 文件的 jq。

单个值工作正常,但解析我遇到问题的 topipsis 列表。

jq -n --arg stat fails --arg count $count  '[{"stat":$stat,"count": $count},{"liststat": "topips",items: $ARGS.positional }]' --args ${ips[@]}

预期结果如下:

{
"topip": ["10.10.20.9","10.10.10.24","10.10.10.26","10.10.10.28","10.10.10.121","192.168.1.152","172.169.10.21","112.10.10.2","10.10.10.21","10.10.10.21"],
"logins":66,
"visits":75,
"errors":1759
}

【问题讨论】:

  • 那个 jq 位试图创建一个对象数组,但您的预期输出是单个对象?
  • 请遵循minimal reproducible example 准则。问题的各个组成部分之间的联系有时看起来相当不透明。

标签: python bash jq


【解决方案1】:

让我们从问题描述中的文字行开始:

192.168.1.2
192.168.1.3
192.168.1.5
192.168.1.6
192.168.1.7

如果 count=0,那么如果您将这些行通过管道传输到您的 jq 程序的这个变体中:

jq -nR --arg stat fails --arg count $count  '
  [{$stat,$count},
   {liststat: "topips",
    items: [inputs]}]'

您将获得如下所示的输出。您应该能够根据您的要求修改此示例。您有可能单独使用 jq 有效地实现所需的输出(即,无需 Q 中显示的任何中间步骤)。

输出

[
  {
    "stat": "fails",
    "count": "0"
  },
  {
    "liststat": "topips",
    "items": [
      "192.168.1.2",
      "192.168.1.3",
      "192.168.1.5",
      "192.168.1.6",
      "192.168.1.7"
    ]
  }
]

【讨论】:

  • 感谢您的回复。想指出跳过一些步骤的方向,有什么我可以查找的吗? jq 页面在 --args 上没有任何内容。很多人将python视为一种解决方案并从多维数组构建。我的脚本只需要解析博客中的某些内容并将其添加到我的 json 中,以便监视器将其拾取并显示在仪表板中。
  • 这个问题已经结束。请解决已提出的问题,或提出新问题。或阅读 jq 文档,例如在线jq教程和手册。
猜你喜欢
  • 2021-11-21
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2019-05-14
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多