击捕捉顺序

问题描述:

所有的数字我有一个在远程机器上运行shell:命令,该命令返回类似这样击捕捉顺序

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test", 
     "delta": "0:00:00.463029", 
     "end": "2017-10-13 22:21:22.428399", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:21:21.965370", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "100  stopped     test    ", 
     "stdout_lines": [ 
      "100  stopped     test    " 
     ] 
    } 
} 

我唯一需要的有用的信息,在这种情况下对stdout数量简单Ansible戏100

有没有办法将此过滤出来,如grep命令,它将仅返回100

到目前为止最好的我是这样的:

ok: [proxmox] => { 
    "CONTAINER_INFO": { 
     "changed": true, 
     "cmd": "pct list | grep -w test | grep -Eo [[:digit:]]", 
     "delta": "0:00:00.477083", 
     "end": "2017-10-13 22:26:03.258617", 
     "failed": false, 
     "rc": 0, 
     "start": "2017-10-13 22:26:02.781534", 
     "stderr": "", 
     "stderr_lines": [], 
     "stdout": "1\n0\n0", 
     "stdout_lines": [ 
      "1", 
      "0", 
      "0" 
     ] 
    } 
} 

纯猛砸

[email protected]:~# pct list | grep -w "test" 
100  stopped     test 
[email protected]:~# pct list | grep -w "test2" 
101  running     test2 

名单并没有真正帮助我在这种情况下。

任何帮助表示感谢,并提前感谢。

使用AWK

$ cat input.txt | awk 'match($0, /"stdout":\s*"([0-9]+)/,a){print a[1]}' 
100 

使用perl的

$ cat input.txt | perl -n -e '/"stdout":\s+"(\d+)/ && print $1,"\n"' 
100 
+0

这是一个通用的bash答案。虽然它可以在Ansible中工作,但我认为过滤器是更好的选择。 –

+0

OP没有提到有效的版本。过滤器仅从版本2.2开始工作。所以,是的,我的解决方案是通用的。不,它不是bash,它适用于任何外壳。 –

+0

我得到的输出就是这个'100停止测试'的例子,所以当我尝试用上述任何一种方法进行过滤时,我在-e第1行附近得到'语法错误,在\“+附近)perl和'语法错误在或接近['for awk。由于某种原因,我无法逃脱或者我做错了某些事情 –

我认为你正在寻找Ansible filters。这将允许您在Ansible中本地使用正则表达式获取值100

+0

不幸的是,过滤器并不能帮助我,因为它会返回“101”:“101”',但是感谢您花时间回答。 –