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)
sed '/host_name/!h;//!d;x;/cluster_name/!d;g' infile
Run Code Online (Sandbox Code Playgroud)
将保存host_name与h旧缓冲区不匹配的每一行,然后将其d删除;对于剩余的每一行,它将x更改缓冲区,如果模式空间不包含cluster_name它将删除它,否则它将g从保持缓冲区和自动打印中取回原始行。