3

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 内のコンテナーを自動的に停止したい。

4

1 に答える 1

2

-oto を複数回指定できる機能は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=""}'
于 2013-11-20T20:27:36.760 に答える