仅当上一行包含特定单词时才打印行

yae*_*ael 3 sed awk perl text-processing

我们有以下包含主机名和主机 ip 的文件(每台 linux 机器有 90-100 台机器的长文件)

hosts.cluster.conf

  "href" : "http://localhost:8080/api/v1/hosts/worker02.sys87.com",
  "Hosts" : 
    "cluster_name" : "hdp",
    "host_name" : "worker02.sys87.com",
    "ip" : "23.67.32.65"


  "href" : "http://localhost:8080/api/v1/hosts/worker03.sys87.com",
  "Hosts" : 
    "cluster_name" : "hdp",
    "host_name" : "worker03.sys87.com",
    "ip" : "23.67.32.66"


  "href" : "http://localhost:8080/api/v1/hosts/worker04.sys87.com",
  "Hosts" : 
    "host_name" : "worker04.sys87.com",
    "ip" : "23.67.32.67"


  "href" : "http://localhost:8080/api/v1/hosts/worker05.sys87.com",
  "Hosts" : 
    "cluster_name" : "hdp",
    "host_name" : "worker05.sys87.com",
    "ip" : "23.67.32.68"
Run Code Online (Sandbox Code Playgroud)

仅当前面的行包含“ cluster_name ”字样时,我们才想打印所有host_name

预期成绩

"host_name" : "worker02.sys87.com",

"host_name" : "worker03.sys87.com",

"host_name" : "worker05.sys87.com",
Run Code Online (Sandbox Code Playgroud)

don*_*sti 5

sed '/host_name/!h;//!d;x;/cluster_name/!d;g' infile
Run Code Online (Sandbox Code Playgroud)

将保存host_nameh旧缓冲区不匹配的每一行,然后将其d删除;对于剩余的每一行,它将x更改缓冲区,如果模式空间不包含cluster_name它将删除它,否则它将g从保持缓冲区和自动打印中取回原始行。