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
、2番目のグループのみを出力します-2番目のオプションは最初のオプションを上書きするようです. これはUbuntu 12.04 LTSにあります。
出力を取得する方法
4e7f430263c33c25970134760ea96f9b57452680a8cfdf062270f5f7fe385135 8000
db35ce4b1fc7580ff43bacda5e961c4741c9447e97dbbdbf38218d068b0132af 5000
それでも「unixy」のままにしますか(できればperl/python/rubyスクリプトはありません)?
背景: 特定のポートを占有している docker 内のコンテナーを自動的に停止したい。