如何按名称sorting“docker service ls”

我使用Docker Swarm 1.13.1,按名称(AZ)列出服务是非常实用的。

我不认为Docker本身支持这个壮举,所以我期望一些awk,sorting和其他一些小黑客。

到目前为止,这是我能得到的最接近的:

root@N01-par1-dev-e:~/deploy-setup# docker service ls | sort -k2,2 -k1 yru8n6zxmp08 consul global 4/4 consul:latest 1lb98n83fttr mysql replicated 1/1 devmtl/percona-fire:5.7.16-10-1 ID NAME MODE REPLICAS IMAGE i75t4zef8x8c papertrail global 4/4 gliderlabs/logspout:latest 4s14t7f13fp8 portainer replicated 1/1 portainer/portainer:1.11.3 8wojufyq3dwn resilio global 4/4 devmtl/resilio-fire:2.4.4-alpine-0 vn8fhhfvb6pw sematext global 4/4 sematext/sematext-agent-docker:1.31.11 mwxtlff6jyl5 thm-s0001-iamfoo replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 o8p4q85axkwy thm-s0002-iambar replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 wedrfqzkg3zp thm-s0003-caply replicated 1/1 devmtl/nginx-fire:1.10.3-alpine-0 ql9yapc0brnk thm-s0003-valgo replicated 1/1 devmtl/caddy:0.9.5-alpine-0 vu3jhyo71oos traefik replicated 1/1 traefik:v1.1.2-alpine 

要么 …

 root@N01-par1-dev-e:~/deploy-setup# docker service ls | tail -n +2 | sort -k2,2 -k1 yru8n6zxmp08 consul global 4/4 consul:latest 1lb98n83fttr mysql replicated 1/1 devmtl/percona-fire:5.7.16-10-1 i75t4zef8x8c papertrail global 4/4 gliderlabs/logspout:latest 4s14t7f13fp8 portainer replicated 1/1 portainer/portainer:1.11.3 8wojufyq3dwn resilio global 4/4 devmtl/resilio-fire:2.4.4-alpine-0 vn8fhhfvb6pw sematext global 4/4 sematext/sematext-agent-docker:1.31.11 mwxtlff6jyl5 thm-s0001-iamfoo replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 o8p4q85axkwy thm-s0002-iambar replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 wedrfqzkg3zp thm-s0003-caply replicated 1/1 devmtl/nginx-fire:1.10.3-alpine-0 ql9yapc0brnk thm-s0003-valgo replicated 1/1 devmtl/caddy:0.9.5-alpine-0 vu3jhyo71oos traefik replicated 1/1 traefik:v1.1.2-alpine 

或者使用2个命令:

 root@N01-par1-dev-e:~/deploy-setup# echo; \ > docker service ls | head -n 1; \ > docker service ls | tail -n +2 | sort -k2,2 -k1; echo; ID NAME MODE REPLICAS IMAGE yru8n6zxmp08 consul global 4/4 consul:latest 1lb98n83fttr mysql replicated 1/1 devmtl/percona-fire:5.7.16-10-1 i75t4zef8x8c papertrail global 4/4 gliderlabs/logspout:latest 4s14t7f13fp8 portainer replicated 1/1 portainer/portainer:1.11.3 8wojufyq3dwn resilio global 4/4 devmtl/resilio-fire:2.4.4-alpine-0 vn8fhhfvb6pw sematext global 4/4 sematext/sematext-agent-docker:1.31.11 mwxtlff6jyl5 thm-s0001-iamfoo replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 o8p4q85axkwy thm-s0002-iambar replicated 1/1 devmtl/iam-this-ctn:1.0.1-alpine-0 wedrfqzkg3zp thm-s0003-caply replicated 1/1 devmtl/nginx-fire:1.10.3-alpine-0 ql9yapc0brnk thm-s0003-valgo replicated 1/1 devmtl/caddy:0.9.5-alpine-0 vu3jhyo71oos traefik replicated 1/1 traefik:v1.1.2-alpine 

提前致谢!

您可以使用awkNAME列中提取名称,并按照以下顺序对生成的名称数组进行sorting以打印行:

对于docker service lsnamesmode的位置被存储为子string名称。 然后,这个关键数组(包含名称)的sorting是用asort处理的:

 docker service ls | awk ' { if (NR == 1) { print $0 names=index($0,"NAME") mode=index($0,"MODE") } else{ key[NR-2]=substr($0,names,mode-1-names) "\t" NR value[NR-2]=$0 } } END { asort(key) for (i=1; i<=(NR-1); i++) { split(key[i],a,"\t") print value[a[2]-2] } }' 

结果将按照包含对[name]\t[index]的已sortingkey数组的顺序进行打印。 该索引用于获取要打印的行。

docker ps -a的情况下, NAMES是最后一列,所以我们在这里取这个长度的固定值100

 docker ps -a | awk ' { if (NR == 1) { print $0 names=index($0,"NAME") } else{ key[NR-2]=substr($0, names, 100) "\t" NR value[NR-2]=$0 } } END { asort(key) for (i=1; i<=(NR-1); i++) { split(key[i],a,"\t") print value[a[2]-2] } }' 

检查这个位置的另一个例子