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/