如何检查docker实例在Bash中运行

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的输出具有空格,而不是制表符,所以可变数量的空格,所以我应该使用特定的正则expression式作为FS字段分隔符,但是我不知道如何。

一个简单的docker ps --format "{{.ID}} {{.Command}} {{.Status}}"将更容易parsing,因为它只有三列。

通过格式化 ,您只能显示所需的最less信息,并在每列之间放置所需的分隔符。

OP loretoparisi 在评论中build议:

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

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

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

统治他们!