前言

由于在工作上,好几次被这个命令坑了,所以在这里记录下.虽然被坑了,但是也因此对linux的命令有进一步认识,尤其打开了grep和awk的大门.

什么是grep

Linux grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

入门参考:菜鸟教程:grep命令

什么是awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

入门参考:awk入门教程–阮一峰

通过grep和awk获取相关docker容器id

通常,在编写构建脚本和运维脚本中需要获取宿主机动态运行的docker容器id和镜像id,这些id在每一个宿主机是不一样的,但是我们往往会使用--name 去命名容器,镜像也有名称和tag,利用这些命名,加上构建脚本的变量,我们可以很简单就写出重用性高的构建脚本.

这里再唠叨一下,通过名称匹配也会有风险,就是命名过于相似的时候,通常命名的会在特定容器上有特定的后缀,避免同shell匹配的时候出错,如果删除了不该删除的文件或者容器,尤其是生产环境,如果出错就麻烦大了,linux上可没有ctrl+z,所以不要过于迷恋这种通过匹配查找的脚本,上线之前需要再三测试.

获得docker容器id

通常写法:

containerId= `docker ps -a| grep bryce-demo | awk '{print $1}' `

上述代码通过先通过docker ps -a 获取docker容器列表,再通过grep 获取与bryce-demo相关的容器,通过awk 打印第一个字段,也就是容器id.

这个写法有些不妥就是在grep匹配出多条的时候出现问题,所以下面展示一个更细粒度的写法

containerId= `docker ps -a| grep bryce-demo | head -1|awk '{print $1}' `

是的,这里就加了一个head -1 获取第一条数据,相反还有tail -1获取最后一条,当存在多条时,可以自己调整.

第二种写法,也是docker官方提供的:

containerId=`docker ps -aq --filter name=bryce-demo`

这个同样会出现当name能匹配多个的实现多个容器id的问题

获得docker镜像id

修改docker容器很多时候伴随着镜像的修改

imageId=`docker images |grep -i $dockerHub/$namespace/$jobname:$tag | head -1 |awk '{print $3}' `

这个跟获取容器id的方式差不多,主要是将相应的参数变量化以期能将脚本通用化。

第二种,写法也是docker 官方提供的:

imageId=`docker images -q --filter reference=$dockerHub/$namespace/$jobname:$tag`

这个同样可以获取想要的镜像id

后记

这里记录一下通过awk获取maven的pom.xml的tag数据

tag=`awk -v RS="</*docker.image.tag>" 'NR==2{print}' pom.xml`

其余命令详见:docker官方文档


本博客所有文章除特别声明外,均采用: 署名-非商业性使用-禁止演绎 4.0 国际协议,转载请保留原文链接及作者。

nginx的简单使用 上一篇

 目录


买个卤蛋,吃根冰棒