3

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 中占用特定端口的容器。

4

1 回答 1

2

指定-o多次的能力pcregrep似乎是最近的发展(版本 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=""}'
于 2013-11-20T20:27:36.760 回答