如何制作一个排除一堆管道的 grep?

如何制作一个排除一堆管道的 grep?

我想使用 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

相关内容