具有多个捕获组的 pcgrep

Mic*_*ler 5 regex unix linux grep docker

pcregrep 中的 -oX 选项有问题。使用不同的数字指定多个此类选项仅输出最后指定的捕获组。

数据:

docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect

输出:

[{
"ID": "4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135",
.... #lots of additional lines
"Ports": {
        "5000/tcp": [
            {
                "HostIp": "127.0.0.1",
                "HostPort": "5000"
            }
        ],
        "5984/tcp": [
            {
                "HostIp": "127.0.0.1",
                "HostPort": "5984"
            }
        ]
    }
},{
#same as above, but with a different ID and HostPort 5000
}]
Run Code Online (Sandbox Code Playgroud)

想法

docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o1 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w)'

输出

4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af
Run Code Online (Sandbox Code Playgroud)

docker ps | awk '{print $1}' | tail -n +2 | xargs docker inspect | pcregrep -M -o2 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w*)'

输出

8000
5000
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在我想将这些输出组合在同一条线上。pcregrep -M -o但是也输出之间的所有内容(似乎忽略了中间组不捕获)并且pcregrep -M -o1 -o2仅输出第二组 - 第二个选项似乎覆盖了第一个选项。这是在 Ubuntu 12.04 LTS 上。

知道如何获得输出

4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000
Run Code Online (Sandbox Code Playgroud)

并仍然保持“unixy”(最好没有 perl/python/ruby 脚本)?

背景:我想自动停止docker中占用特定端口的容器。

小智 4

万一有人想知道 10 年后......

-o现在是 的一个成熟的部分pcregrep,而且,它还附带了一个朋友:--om-separator=text

所以原来问题的答案是:添加--om-separator=" "pcregrep.

PS 我觉得奇怪的是,并不是所有的手册页网站都会列出它,pcregrep --help但确实如此。