前言
由于在工作上,好几次被这个命令坑了,所以在这里记录下.虽然被坑了,但是也因此对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 国际协议,转载请保留原文链接及作者。