看到一篇“Docker 技巧:删除 Docker 容器和镜像”其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明:html
docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')
不少挺长的指令不明白的时候能够拆成短的去学习了解,这里 “$()” 中的语句能够单摘出来:docker
docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}'
这条语句又能够看做两步操做:shell
docker images:查询本地镜像列表;centos
awk:文本分析工具,这里的 “'$1 == "<none>" && $2 == "<none>" {print $3}'
” 是它的判断条件和具体操做;工具
为了方便理解,这里再简化下语句:学习
docker images | awk '{print $0}' # 返回结果: REPOSITORY TAG IMAGE ID CREATED SIZE mono/jexus 6.24 1972cdc31613 4 days ago 727.9 MB
而后将结果与下面的两个语句进行对比ui
docker images | awk '{print $1}' # 返回结果: REPOSITORY mono/jexus docker images | awk '{print $3}' # 返回结果: IMAGE 1972cdc31613
不难看出 “$
” 后的参数分别对应的结果是有规律的。实际上,awk
认为文本文件都是结构化的,它将每个输入行定义为一个记录,行中的每一个字符串定义为一个域(段),域和域之间使用分割符分割。awk
会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。code
行工做模式,读入文件的每一行,会把一行的内容,存到$0里;htm
使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每一个段存到相应的变量$(1-100);blog
输出的时候按照内置变量OFS(out FS);
读入下一行继续操做;
而'$1 == "<none>" && $2 == "<none>" {print $3}'
中的$1 == "<none>" && $2 == "<none>"
含义则是每行拆分出的第一个字段和第二字段均为 “<none>
”,那么就执行{print $3}
,即输出该行记录中的镜像ID。咱们这里是要删除名称和标签均为none的镜像,那么只能经过docker rmi ImageID
来删除镜像,因此最后无需输出整行记录,只需输出镜像的id便可,而镜像id处在一行记录拆分后的第三个,即$3
,因此这里用{print $3}
便可。而后组合起来就是:
docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')
经过awk能够获得想要的文本,再与docker的其余命令组合能够实现不少有意思的功能,关于awk更多的信息请参考《Shell脚本之awk详解》,这里是备份。关于Docker的相关指令能够参照《Docker的学习--命令使用详解》,里面有详尽的注释。
另外,若是须要几个命令组合就能够用$()
将命令嵌套起来,如:
# 查询本地镜像的ID列表 docker images -q
和
# 根据镜像的ID或镜像的名称 + 标签删除镜像 docker rmi ImageID
组合以后就成了
# 删除全部的镜像 docker rmi $(docker images -q)
一样的,你能够根据本身的状况将其余的命令进行组合,同时用awk对文本进行处理能够实现更多有意思的功能。还有就是若是对docker的命令不熟悉的话
# 查看命令的帮助信息 docker COMMAND --help # 例如: docker rmi --help # 返回结果 Usage: docker rmi [OPTIONS] IMAGE [IMAGE...] Remove one or more images -f, --force Force removal of the image --help Print usage --no-prune Do not delete untagged parents
这里没办法列全全部的用法,也不必,若是你本身掌握用法既能够记得牢,也能够本身组合出本身须要的命令。
参考文献: