【问题标题】:A grep (or sed, or awk) command to select all lines that follow a specific pattern after a specific start line in a file一个 grep(或 sed 或 awk)命令,用于选择文件中特定起始行之后遵循特定模式的所有行
【发布时间】:2017-12-29 12:47:44
【问题描述】:

Docker Composeyml 文件中,卷在以volumes: 行开头并后跟- host/dir:guest:dir 等模式的部分中声明。该节以下一节的开头结束,其名称不会一直相同,它可以是ports:environment:networks: 等中的任何一个。通常有不止一个 volumes: 部分,并且每个部分中的行数是未知的(并且在 volumes: 部分中不是恒定的)。

我需要从yml 文件的所有volumes: 部分中提取所有卷声明(即- host/dir:guest:dir)。

谢谢!

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

【问题讨论】:

  • 用正则表达式解析yaml,这不是一个好主意。 Python 有一个 yaml 模块可以使用
  • 谢谢@Inian。我需要一个bash 单线解决方案。
  • 好吧,如果您觉得正则表达式可以解决这个问题,那么请自己努力质疑......并添加预期的输出以清楚起见......

标签: bash awk sed grep yaml


【解决方案1】:

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
/volumes:/{a=1; next}:如果该行包含volumes:,则设置a=1next,即跳转到下一条记录
a:如果a=1则打印记录

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

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

如果第一个字段不是-,这将重置a

【讨论】:

  • 谢谢!我必须将 awk 添加到问题的标题中。
【解决方案2】:
awk '$1=="-"{if (f) print; next} {f=/^[[:space:]]*volumes:/}' file

【讨论】:

  • 谢谢! volumes: 部分为空的情况应该很少见,但它可能会发生。
  • 如果确实发生了,脚本会很好地处理它,它会在每个 volumes: 部分中稳健/可靠地打印声明,不多也不少。
  • 我想说同样的话。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多