资讯专栏INFORMATION COLUMN

awk在删除镜像过程中的用法及说明

lentoo / 2261人阅读

摘要:实际上,认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域段,域和域之间使用分割符分割。

看到一篇“Docker 技巧:删除 Docker 容器和镜像”其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明:

docker rmi $(docker images | awk "$1 == "" && $2 == "" {print $3}")

很多挺长的指令不明白的时候可以拆成短的去学习了解,这里 “$()” 中的语句可以单摘出来:

docker images | awk "$1 == "" && $2 == "" {print $3}"

这条语句又可以看作两步操作:

docker images:查询本地镜像列表;

awk:文本分析工具,这里的 “"$1 == "" && $2 == "" {print $3}"” 是它的判断条件和具体操作;

为了方便理解,这里再简化下语句:

docker images | awk "{print $0}"
# 返回结果:
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mono/jexus              6.24                1972cdc31613        4 days ago          727.9 MB

然后将结果与下面的两个语句进行对比

docker images | awk "{print $1}"
# 返回结果:
REPOSITORY
mono/jexus

docker images | awk "{print $3}"
# 返回结果:
IMAGE
1972cdc31613

不难看出 “$” 后的参数分别对应的结果是有规律的。实际上,awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域(段),域和域之间使用分割符分割。awk会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。

行工作模式,读入文件的每一行,会把一行的内容,存到$0里;

使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100);

输出的时候按照内置变量OFS(out FS);

读入下一行继续操作;

"$1 == "" && $2 == "" {print $3}"中的$1 == "" && $2 == ""含义则是每行拆分出的第一个字段和第二字段均为 “”,那么就执行{print $3},即输出该行记录中的镜像ID。我们这里是要删除名称和标签均为none的镜像,那么只能通过docker rmi ImageID来删除镜像,所以最后无需输出整行记录,只需输出镜像的id即可,而镜像id处在一行记录拆分后的第三个,即$3,所以这里用{print $3}即可。然后组合起来就是:

docker rmi $(docker images | awk "$1 == "" && $2 == "" {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

这里没办法列全所有的用法,也没必要,如果你自己掌握用法既可以记得牢,也可以自己组合出自己需要的命令。

参考文献:

Shell脚本之awk详解;

Docker的学习--命令使用详解;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26649.html

相关文章

  • awk删除docker历史镜像

    摘要:初步列了以下方案用实现擅长,通过重定向将的输出传给,处理完后执行系统命令清除镜像。对镜像列表进行去重操作可以以镜像名称为进行去重获取历史镜像要保留最近个镜像清除历史镜像,其实就是保留数据前行,有个内置变量保存当前处理行编号。 背景 虽然对awk早有耳闻,据说是个很强大的工具,但一直没机会去了解和使用,最近碰到一个需求,用awk轻松解决,才真正一窥它的厉害。需求是这样的,应用每次升级都会...

    lentoo 评论0 收藏0
  • dockercentos安装golang操作部分理解

    摘要:前两天在本地安装了,熟悉了下命令之后,还是忍不住到上进行了一波镜像部署,以下是我的操作步骤和一些想法。但是如果想要将当前目录的文件复制进里头,首先要保证镜像在运行,然后命令中的容器名使用我圈出来的那个名字。 前两天在本地安装了docker,熟悉了下命令之后,还是忍不住到centos上进行了一波golang镜像部署,以下是我的操作步骤和一些想法。准备:一台安装了docker的可联网的ce...

    huaixiaoz 评论0 收藏0
  • 命令总结

    摘要:博文参考命令预览基础命令文本搜索权限管理文件搜索帮助命令用户管理压缩解压网络配置关机重启常用命令系统信息显示机器的处理器架构显示正在使用的内核版本显示的信息校验内存使用显示哪些被使用显示内核的版本显示网络适配器及统计显示已加载的文件系统 博文参考 http://www.178linux.com/78199 http://www.cnblogs.com/suliuer/p/5448747...

    pubdreamcc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<