pcregrep有多个捕获组

时间:2013-11-13 09:06:53

标签: regex linux unix 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
}]

理念

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

输出

4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af

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

输出

8000
5000

到目前为止一切顺利。现在我想把这些输出结合在同一条线上。然而,pcregrep -M -o也输出介于两者之间的所有东西(似乎忽略了中间组不捕获)而pcregrep -M -o1 -o2只输出第二组 - 第二个选项似乎覆盖了第一个选项。这是在Ubuntu 12.04 LTS上。

知道如何获得输出

4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000

仍然保持'unixy'(最好没有perl / python / ruby​​脚本)?

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

1 个答案:

答案 0 :(得分:1)

-o多次指定到pcregrep的能力似乎是最近的发展(version 8.32,2012年11月30日发布)。我假设你的发行版还没有这个。 :-)所以,改用awk。此外,在第一个tail脚本中用等效功能替换原始版本中awk的无关使用。

docker ps | awk '(NR >= 2) { print $1 }' | xargs docker inspect | awk '($1~/"ID":/){gsub("\"|,","",$2);id=$2}; (id && $1~/"HostPort":/) {gsub("\"","",$2);print id " " $2;id=""}'