具有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
我想匹配状态和名称列以检查哪个是实例状态,因此从列索引1开始的第5列和第7列.
假设我使用制表符分隔值
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所述,但我不知道如何操作.
最佳答案
一个简单的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'
to get col 2,or you could do:
docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | awk -F$"\t" '{printf "%s|%s|%s\n",$1,$2,$3}'
to rule them all!