我想使用 grep 来区分主机名。我有2个文件。一份 yaml 和一份 .pp。在 yaml 中,我有带有 ips 的域名,在 .pp 文件中,我有散列样式的 fqdn 和 ip。像这样:
在第一个文件中,我有一个主机列表:
{主机 => 主机1,ip = xxxx },
{主机 => 主机2,ip = xxxx },
在第二个文件中,我有另一组主机,如下所示:
主机1:
ip: xxxx
主机2:
ip: xxxx
我首先尝试获取第一个文件的主机列表,同时获取第二个文件的主机列表。如果第一个文件的主机位于第二个文件中,我会跳过它。
cat FILEONE.pp | grep 'host =>' | grep -v "cat FILETWO.yaml | grep '[0-9]:' | grep -v ip"
筛选
我想将其传递给前一个 grep"cat FILETWO.yaml | grep '[0-9]:' | grep -v ip"
作为标志的参数-v
以进行反向 grep 但我无法使其工作...
可以即时制作吗?
这个问题可以简化为:
我怎样才能做到这一点:
grep -v {cat file | command2 | command3 | command4}
我想创建一个列表,仅当它们不在第二个文件中时才包含第一个文件中的主机。 (从第一个文件中排除第二个文件的主机)
答案1
怎么样
cat FILEONE.pp | grep "host = $(cat FILETWO.yaml | grep '[0-9]:' | grep -v ip)"
答案2
我认为这可以按照您需要的方式工作:
for host in $(awk '{print $3}' FILEONE.pp | sed "s/,//"); do grep -q $host FILETWO.yaml || echo $host; done
仅当主机不在第二个文件中时,才会打印第一个文件中的主机列表。
答案3
awk
最适合这些事情:
awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1
只需循环访问数组中存储主机名称的第二个文件即可a[]
。然后,循环遍历第一个文件,检查第三个字段是否在数组中。
Note-F"[: ,]*"
用于将字段分隔符设置为:
,,
或空格。
测试
给定这些示例文件:
$ cat f1
host = host1, ip = x.x.x.x
host = host2, ip = y.y.y.y
host = host3, ip = z.z.z.z
$ cat f2
host1:
ip: x.x.x.x
host3:
ip: x.x.x.x
查看输出:
$ awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1
host = host1, ip = x.x.x.x
host = host3, ip = z.z.z.z