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
}]The Idea
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只输出第二个组--第二个选项似乎覆盖了第一个组。这是在Ubuntu12.04 LTS上。
知道怎么得到输出吗?
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000并且仍然保持“unixy”(最好没有perl/python/ruby脚本)?
背景:我想要自动停止集装箱在码头占用特定的港口。
发布于 2013-11-20 20:27:36
将-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=""}'https://stackoverflow.com/questions/19949566
复制相似问题