docker 具有多个捕获组的pcregrep

w6lpcovy  于 2023-01-29  发布在  Docker
关注(0)|答案(2)|浏览(99)

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脚本)?
背景:我想自动停止在码头占用特定港口的集装箱。

jtjikinw

jtjikinw1#

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

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=""}'
kpbwa7wx

kpbwa7wx2#

以防有人在10年后想知道...
-o现在是pcregrep的成熟组成部分,而且它还附带了一个朋友:--om-separator=text.
所以最初问题的答案是:把--om-separator=" "加到pcregrep上。
我觉得奇怪的是,并不是所有的手册页网站都列出了它,pcregrep --help确实列出了。

相关问题