Como fazer um grep que exclui um monte de tubos?

1

Eu quero fazer um diff de hostnames usando grep. Eu tenho 2 arquivos. Um yaml e um .pp. No yaml eu tenho nomes de domínio com ips e no arquivo .pp tenho fqdn e ip no estilo hash. Assim:

No primeiro arquivo, tenho uma lista de hosts:

{host => host1, ip = x.x.x.x },

{host => host2, ip = x.x.x.x },

No segundo arquivo, tenho outro grupo de hosts como este:

host1:

ip: x.x.x.x

host2:

ip: x.x.x.x

Estou tentando primeiro obter a lista de hosts do primeiro arquivo e, ao mesmo tempo, obter a lista de hosts do segundo arquivo. Se o host do primeiro arquivo estiver no segundo, eu o pulo.

cat FILEONE.pp | grep 'host =>' | grep -v "cat FILETWO.yaml | grep '[0-9]:' | grep -v ip"

Filtro

Eu quero passar isso: "cat FILETWO.yaml | grep '[0-9]:' | grep -v ip" como parâmetro para o -v flag para o grep anterior para fazer um grep inverso mas não consigo fazer isso funcionar ...

É possível fazer isso na hora?

A questão pode ser reduzida para:

Como posso fazer isso:

grep -v {cat file | command2 | command3 | command4}

Eu quero fazer uma lista que contenha os hosts no primeiro arquivo somente se eles não estiverem no segundo arquivo. (Excluir os hosts do segundo arquivo do primeiro arquivo)

    
por AAlvz 30.09.2014 / 13:38

3 respostas

0

Que tal

cat FILEONE.pp | grep "host = $(cat FILETWO.yaml | grep '[0-9]:' | grep -v ip)"
    
por 30.09.2014 / 14:01
0

Acho que isso funciona do jeito que você precisa:

for host in $(awk '{print $3}' FILEONE.pp | sed "s/,//"); do grep -q $host FILETWO.yaml || echo $host; done

Isso imprime uma lista dos hosts no primeiro arquivo apenas se eles não estiverem no segundo arquivo.

    
por 30.09.2014 / 15:19
0

awk é melhor para essas coisas:

awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1

Basta percorrer o segundo arquivo que armazena os nomes dos hosts na matriz a[] . Em seguida, percorra o primeiro arquivo, verificando se o terceiro campo está na matriz.

Observação -F"[: ,]*" é usado para definir o separador de campos como : , , ou espaços.

Teste

Dados estes arquivos de amostra:

$ 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

Veja a saída:

$ 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
    
por 30.09.2014 / 15:57

Tags