bash正则表达式获取docker容器端口号

kil*_*eet 4 bash docker

所以我试图从我的 docker 集群获取特定的端口号,这样做是因为我稍后需要该端口。

当我执行 docker-compose ps 时,我得到以下输出

contaimer_db_1            docker-entrypoint.sh mysqld      Up      3306/tcp
container_node_1          /usr/bin/supervisord -n          Up      0.0.0.0:3902->3902/tcp
container_php_1           docker-php-entrypoint php-fpm    Up      9000/tcp
container_redis_1         docker-entrypoint.sh redis ...   Up      6379/tcp
Run Code Online (Sandbox Code Playgroud)

我想得到的是来自container_node_1 3902的端口号

到目前为止我得到了

docker-compose ps | grep "[ :]\?[[:digit:]]\{4\}"
Run Code Online (Sandbox Code Playgroud)

但这将获取所有端口,因为它们连续有 4 个数字。我如何更改它以确保它只获取节点端口?

如果有任何帮助,节点容器将始终显示为 0.0.0.0:1234->1234

Ini*_*ian 5

单独使用Awk并调用split()函数两次,

docker-compose ps | awk '$1=="container_node_1"{n=split($NF,arr1,"->"); split(arr1[n],arr2,"/"); print arr2[1]}'
Run Code Online (Sandbox Code Playgroud)

将为您提供预期的端口号。这适用于任何 POSIX兼容的Awk安装。

如果你已经GNU Awk安装了,你可以使用它的gensub()功能进行正则表达式匹配并提取端口号,

docker-compose ps | awk '$1=="container_node_1"{print gensub(/.*->([[:digit:]]+)\/(.+)$/,"\\1","g",$NF)}'
Run Code Online (Sandbox Code Playgroud)

里面使用的正则表达式的正则表达式演示。