如何检查Docker实例是否在Bash中运行

时间:2016-12-18 16:33:08

标签: regex bash docker

拥有docker ps -a

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                    PORTS                    NAMES

56489a32cb8c        83132b61eccf                  "bash"                   41 hours ago        Exited (0) 41 hours ago                            naughty_jang
4b4933b40175        83119b65eccf                  "bash"                   41 hours ago        Exited (0) 41 hours ago                            suspicious_mcnulty
3149e612f9f8        83119b6143cf                  "sh"                     43 hours ago        Exited (0) 41 hours ago                            thirsty_mestorf

我希望匹配STATUSNAMES列以检查哪个是实例状态,因此列5和7从列索引1开始。

假设我有标签分隔值

docker ps -a | awk -FS $'\t' '{print $5,$7}'

docker ps -a | awk 'BEGIN {FS="\t"}; {print $5,$7}'

但这不起作用,同时将默认的空白字符串保留为FS

docker ps -a | awk 'BEGIN {FS=" "}; {print $5,$7}'

所以我试着像

那样匹配一列
awk -F$" " -v COLT=$1 '
        NR==1 {
                for (i=1; i<=NF; i++) {
                        if ($i==COLT) {
                                title=i;
                        }
                }
        }
        NR>1 {
                if (i=title) {
                        print $i
                }
        }
'

希望在你做的脚本中有这个

docker ps -a | ./status.sh NAMES

但是由于标签空间不匹配,这将无法正常工作。 这里的问题是docker ps -a的输出有空格,而不是制表符,所以空格可变,所以我应该使用特定的正则表达式FS字段分隔符,如here所述,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:3)

简单的docker ps --format "{{.ID}} {{.Command}} {{.Status}}"会更容易解析,因为它只有三列。

使用formatting,您只能显示所需的最低限度信息,并在每列之间拥有所需的分隔符。

OP loretoparisi建议in the comments

docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | cut -f2 -d$'\t' 
  

获得第2组,或者你可以这样做:

docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | awk -F$"\t" '{printf "%s|%s|%s\n", $1, $2, $3}' 
  

统治他们所有人!