regex - 具有多个捕获组的 pcregrep

标签 regex linux unix grep docker

pcregrep 中的 -oX 选项有问题。指定多个具有不同编号的此类选项仅输出最后指定的捕获组。

数据:

docker | awk '{print $1}' |尾-n +2 | xargs docker 检查

输出:

[{
"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 | awk '{print $1}' |尾-n +2 | xargs docker 检查 | pcregrep -M -o1 'ID":\s"(\w*)(?:\n|.)*?HostPort":\s"(\w)'

输出

4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af

docker | awk '{print $1}' |尾-n +2 | xargs docker 检查 | 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中占用特定端口的容器。

最佳答案

pcregrep 多次指定 -o 的能力似乎是最近的发展(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=""}'

关于regex - 具有多个捕获组的 pcregrep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19949566/

相关文章:

shell - 如何按行数限制(或截断)文本文件?

在 UNIX 中创建 FIFO

python - 替换用小写字母括起来的字符

javascript - 用于用户名验证的 java 和 javascript 之间的正则表达式差异

java - 用 "$"替换时 replaceFirst() 失败

regex - 如何将所有正则表达式匹配项放入字符串列表中

java - 如果我将 max -Xmx2048m 内存分配给具有 2GB RAM 的 64 位 Linux 机器的 Java 进程,会发生什么情况?

bash - 从目录递归查找最大文件大小

python - 从Linux服务器将.txt重写为.pdf代码,以在Windows Enterprise 2008服务器上工作

c++ - 使用 select() 进行非阻塞串行