Bash按顺序捕获所有数字

时间:2017-10-13 23:13:49

标签: regex bash perl awk grep

我有简单的Ansible游戏,在远程机器上运行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上的数字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"
        ]
    }
}
  

Pure Bash

root@pve:~# pct list | grep -w "test"
100        stopped                 test
root@pve:~# pct list | grep -w "test2"
101        running                 test2

在这种情况下,列表并没有真正帮助我。

任何帮助都表示赞赏,并提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

使用 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