Veja o comando comm
. Pegue os dois arquivos a seguir
f1.txt
item1
item2
item3
item4
item5
item6
f2.txt
item1
item2
item22
item3
item4
Saída
$ comm -23 f1.txt f2.txt
item5
item6
Eu tenho o começo de um script que estou juntando para checar os hosts Xen ... essa pergunta é bem dupla. Em primeiro lugar, tenho o trecho de código abaixo;
TMPFILE001=/tmp/FILE001.rx TMPFILE002=/tmp/FILE002.rx TMPFILE003=/tmp/FILE003.rx xe vm-list params=uuid,is-control-domain | grep -B1 true | grep uuid | awk {'print $5'} > $TMPFILE001 xe vm-list params=uuid --minimal | tr ',' '\n' > $TMPFILE002
Portanto, isso me dá duas listas, desejo remover qualquer coisa que apareça no FILE002.rx que apareça em FILE001.rx e imprima isso em FILE003.rx.
O ideal é que eu não tivesse nenhum arquivo usado, mas eu estava tentando fazer com que ele funcionasse tentando capturá-los em variáveis.
Assim, se possível, seria melhor executar o script, comparar a saída dos dois comandos e mostrar apenas o restante, uma vez que a saída do comando 2 tenha sido retirada do comando 1.
Saída do comando 1;
cat /tmp/FILE001.rx 468190e5-c78b-4337-8094-20638353b470 5926bbf3-c48c-4c2a-8113-d7e58520cfe7 3f98ee14-5e60-4e9b-852a-f924ffe80791
Saída do comando 2 (aparada);
cat /tmp/FILE002.rx | head -5 37ae6b9e-8a00-ab10-7e17-3d70ab275b9b d8208537-0d69-1332-9301-4699d194430f 1cf06668-5450-4d44-a7ba-c2c7b6bcd6b2 7d11c6e3-48ef-0e5e-c6ed-e8f2548533fd 7d3d0ba3-a6d6-d2a7-99f0-06fa74e625fa
Veja o comando comm
. Pegue os dois arquivos a seguir
f1.txt
item1
item2
item3
item4
item5
item6
f2.txt
item1
item2
item22
item3
item4
Saída
$ comm -23 f1.txt f2.txt
item5
item6
Para responder a uma parte da questão, você pode usar o grep com o sinalizador -F para comparar a diferença entre dois arquivos. Eu então combinei isso com -v para tirar a diferença do que eu exigia;
grep -vxFf $TMPFILE001 $TMPFILE002 > $TMPFILE003
Ou, se preferir, você pode fazer isso:
diff file1 file2 | grep "<" | sed 's/^<\ //g' > file3
Tags bash