【问题标题】:check value of json response in bash script检查 bash 脚本中 json 响应的值
【发布时间】:2017-07-28 07:12:04
【问题描述】:
{"running": 1, "finished": 3, "node_name": "L-2.local", "pending": 0, "status": "ok"}

我正在尝试解析此响应以使用 bash 脚本检查“正在运行”的值。我知道有库可以做到这一点,但由于某些原因 jq 库不会安装,我不想安装它,因为我只需要它来执行这个命令。通常我会使用 Python。

我尝试在响应中使用另一个答案中的此命令

| grep -Po '"running":"\K[^,]*'

但由于“。”而失败

bash: {"running": 0, "finished": 0, "node_name": "L-2: command not found

有没有办法让它用 grep 检查“运行”的值,并且没有错误?

【问题讨论】:

  • 你在:之后的模式中有一个",但字符串中没有引号。使用echo '...string...' | grep -Po '"running":\s*\K[^,]+'。如果您确定只有数字,请使用'"running":\s*\K\d+'
  • 谢谢,我的意思是添加不带引号的版本。我现在发现 -P 选项不适用于 OSX,所以还不能让它工作。
  • 您可以使用sed 来获取值,尽管它看起来并不漂亮。看我的回答。

标签: json bash shell grep


【解决方案1】:

首先,这个错误bash: {"running": 0, "finished": 0, "node_name": "L-2: command not found是因为你没有在你的表达式之前使用echo。

使用:echo '{"running": 1, "finished": 3, "node_name": "L-2.local", "pending": 0, "status": "ok"}' | grep -Po '"running":\s*\K\d+'

【讨论】:

    【解决方案2】:

    您可以使用sed 删除您不需要的内容,仅使用捕获组和反向引用捕获并保留您需要的内容:

    s='{"running": 1, "finished": 3, "node_name": "L-2.local", "pending": 0, "status": "ok"}'
    echo $s | sed 's/.*"running":[[:space:]]*\([0-9]*\).*/\1/'
    

    请参阅online demo

    模式详情

    • .* - 尽可能多的任何 0+ 个字符
    • "running": - 文字子串
    • [[:space:]]* - 0+ 个空格
    • \([0-9]*\) - 一个匹配 0 个或多个数字的捕获组(注意转义,它们是必要的,因为该模式符合 POSIX BRE)
    • .* - 该行的其余部分。

    \1 是对第 1 组值的反向引用。

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多