bash – 一个grep(或sed或awk)命令,用于选择文件中特定起始行后面的特定模式后面的所有行

在Docker Compose的yml文件中,卷在以volumes:line开头的部分中声明,然后是 – host / dir:guest:dir等模式. sections以下一部分的开头结束,其名称不会始终相同,它可以是ports:,environment:和networks:等等中的任何一个.通常有多个卷:section,并且每个卷中的行数是未知的(并且在卷上不是恒定的:节).

我需要从所有卷中提取所有卷声明(即 – host / dir:guest:dir):yml文件的各个部分.

谢谢!

示例yml文件

version: '2'
services:
  service1:
    image: repo1/image1
    volumes:
      - /dir1/dir2:/dir3/dir4
      - /dir5/dir6:/dir7/dir8
    ports:
      - "80:80"
  service2:
    image: repo2/image2
    volumes:
      - /dir9/dir10:/dir11/dir12
    environment:
      - A: B
awk单行

假设你有/每个卷声明

输入:

version: '2'
services:
  service1:
    image: repo1/image1
    volumes:
      - /dir1/dir2:/dir3/dir4
      - /dir5/dir6:/dir7/dir8
    ports:
      - "80:80"
  service2:
    image: repo2/image2
    volumes:
      - /dir9/dir10:/dir11/dir12
    environment:
      - A: B
    volumes:
      - /dir1/dir2:/dir3/dir4
      - /dir5/dir6:/dir7/dir8
meow:

输出

$awk '$0!~"/"{a=0}  /volumes:/{a=1; next}a' file
      - /dir1/dir2:/dir3/dir4
      - /dir5/dir6:/dir7/dir8
      - /dir9/dir10:/dir11/dir12
      - /dir1/dir2:/dir3/dir4
      - /dir5/dir6:/dir7/dir8

$0!〜“/”{a = 0}:如果记录/行不包含/表示它不是卷声明;设a = 0
/卷:/ {A = 1; next}:如果该行包含volume:则设置a = 1,然后设置为next,即跳转到下一条记录
a:如果a = 1,则打印记录

PS:如果在你的yml文件中包含/的标签可以在卷之后,那么这可能会失败.如果是这种情况,那么使用这个awk:

$awk '$1!~"-"{a=0}  /volumes:/{a=1; next}a' file

这将重置if第一个字段不是 –

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...