Que tal
cat FILEONE.pp | grep "host = $(cat FILETWO.yaml | grep '[0-9]:' | grep -v ip)"
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)
Que tal
cat FILEONE.pp | grep "host = $(cat FILETWO.yaml | grep '[0-9]:' | grep -v ip)"
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.
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.
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