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中自动停止占用特定端口的容器。
答案 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=""}'