拥有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
我希望匹配STATUS
和NAMES
列以检查哪个是实例状态,因此列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所述,但我无法弄清楚如何。
答案 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}'
统治他们所有人!