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

bash正则表达式以获取docker容器端口号,bash,docker,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

所以我试图从我的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
我想从container\u node\u 1 3902获取端口号

到目前为止我

docker-compose ps | grep "[ :]\?[[:digit:]]\{4\}"
但这将获得所有端口,因为它们一行有4个数字。我如何更改它以确保它只获取节点端口

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

单独使用Awk并调用拆分函数两次

docker-compose ps | awk '$1=="container_node_1"{n=split($NF,arr1,"->"); split(arr1[n],arr2,"/"); print arr2[1]}'
将按预期提供端口号。这将适用于安装的任何符合POSIX的Awk

如果安装了GNU Awk,则可以使用其函数进行正则表达式匹配并提取端口号

docker-compose ps | awk '$1=="container_node_1"{print gensub(/.*->([[:digit:]]+)\/(.+)$/,"\\1","g",$NF)}'
对于内部使用的正则表达式。

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

docker-compose ps | awk '$1=="container_node_1"{n=split($NF,arr1,"->"); split(arr1[n],arr2,"/"); print arr2[1]}'
将按预期提供端口号。这将适用于安装的任何符合POSIX的Awk

如果安装了GNU Awk,则可以使用其函数进行正则表达式匹配并提取端口号

docker-compose ps | awk '$1=="container_node_1"{print gensub(/.*->([[:digit:]]+)\/(.+)$/,"\\1","g",$NF)}'
对于内部使用的正则表达式。

我宁愿使用docker inspect

范例

码头工人

名称命令状态端口 dockerpartkeepr_数据库_1 docker-entrypoint.sh mysqld Up 3306/tcp dockerpartkeepr\u partkeepr\u 1 docker php入口点亚太地区。。。向上0.0.0.0:80->80/tcp

因此,我将尝试将端口链接到80

docker inspect-格式“{index index index.NetworkSettings.Ports 80/tcp 0.HostPort}”dockerpartkeepr\u partkeepr\u 1

这将显示

八十

看到我的答案了吗

更多解释,我宁愿使用docker inspect

范例

码头工人

名称命令状态端口 dockerpartkeepr_数据库_1 docker-entrypoint.sh mysqld Up 3306/tcp dockerpartkeepr\u partkeepr\u 1 docker php入口点亚太地区。。。向上0.0.0.0:80->80/tcp

因此,我将尝试将端口链接到80

docker inspect-格式“{index index index.NetworkSettings.Ports 80/tcp 0.HostPort}”dockerpartkeepr\u partkeepr\u 1

这将显示

八十

看到我的答案了吗


更多解释

你想得到的只是容器节点1?是的,我更愿意得到容器节点3902try awk-F'[/>]'/container\u节点1/{print$NF-1}的运行docker compose ps | awk-F'[/>'/financegilde830\u节点1/{print$NF-1}只会返回tcpOnly for container_node_1这是您想要的吗?是的,我更喜欢只获取container_node_1 3902; 2 try awk-F'[/>]'/container_node_1/{print$NF-1}运行docker compose ps | awk-F'[/>]'/financegilde830_node_1/{print$NF 1}只会返回tcpYou先生是我今天的救星:,5分钟过后,我会接受答案passed@killstreet:很高兴能帮上忙!您只需要一个拆分$NF,arr1,/->\/;打印arr1[2]先生,您今天是我的救世主:,在5分钟后接受答案passed@killstreet:很高兴能帮上忙!您只需要一个拆分$NF,arr1,/->\/;打印arr1[2]这仅在您知道所使用的端口时有效,我的端口可以是可变的。应该在我的问题中加上这一点。这只有在您知道所使用的端口时才起作用,我的端口可以是可变的。也许应该在我的问题上加上这个。