在bash脚本

时间:2017-07-28 07:12:05

标签: json bash shell grep

{"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,没有错误?

2 个答案:

答案 0 :(得分:3)

首先,此错误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+'

答案 1 :(得分:1)

您可以使用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+ whitespaces
  • \([0-9]*\) - 一个捕获组(注意转义,它们是必要的,因为该模式符合POSIX BRE)匹配0或更多位数
  • .* - 其余部分。

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