Como comparar arquivos no Linux com cmp, comm, diff e sdiff
Comparar arquivos no Linux com cmp, comm, diff e sdiff
Neste tutorial vamos estudar algumas ferramentas que nos permitem realizar a comparação de arquivos de texto no Linux, de acordo com o seu conteúdo. As ferramentas a serem estudadas são as seguintes:
- cmp
- comm
- diff
- sdiff
Vamos aos comandos.
Comando cmp
O comando cmp compara o conteúdo de dois arquivos e envia o resultado para a saída padrão.
Usa-se o comando cmp para arquivos que não são de texto para verificar se são idênticos. Para comparar arquivos de texto, use o comando diff.
Se os arquivos forem idênticos, não será gerada nenhuma saída.
Caso haja diferenças, serão mostrados o número da linha e do byte da primeira posição diferente entre eles.
Algumas opções do cmp
-l
Mostrar, para cada diferença, o número do byte em decimal e os bytes diferentes em octal.
-s
Retorna apenas um status de saída (exit code) sem gerar nenhuma saída. Os valores de saída são: 0 para arquivos idênticos, 1 se os arquivos forem diferentes ou 2 se o comando cmp não conseguir comparar os arquivos.
Esse flag é muito útil em scripts do shell.
Para ver o status de saída, execute a comparação com cmp -s e logo após execute o comando echo $?
Exemplos:
1. Copie para seu home (/root) os arquivos which e zegrep (entre no /root antes):
# cp /bin/which . # cp /bin/zegrep .
2. Faça uma segunda cópia do arquivo which:
# cp which which2
3. Vamos comparar os arquivos:
# cmp which which2 # cmp which zegrep
4. Usando a opção -l:
# cmp -l which zegrep
5. Usando a opção -s:
# cmp -s which zegrep # echo $?
Comando comm
O comando comm é usado para comparar arquivos de texto que estejam com os dados ordenados.
O resultado da comparação é gerado na saída padrão em três colunas, na ordem a seguir:
- Linhas que existem apenas no primeiro arquivo
- Linhas que existem apenas no segundo arquivo
- Linhas que existem em ambos os arquivos.
O comando comm pode ser usado para incluir ou excluir linhas em comum nos arquivos na exibição do resultado.
Podemos usar algumas flags:
-1
Para suprimir a exibição da primeira coluna
-2
Para suprimir a exibição da segunda coluna
-3
Para suprimir a exibição da terceira coluna
Vamos testar o comando comm:
1. Crie um arquivo de texto denominado teste-comm:
# vi teste-comm
2. Digite o conteúdo a seguir no arquivo:
Arara Bem-Te-Vi Pardal Sabiá Tucano Uirapuru
3. Faça uma cópia do arquivo:
# cp teste-comm teste-comm2
4. Vamos testar o comando:
# comm teste-comm teste-comm2
Só aparecerá a terceira coluna, pois o conteúdo dos arquivos é idêntico.
5. Altere o arquivo teste-comm adicionando a palavra Mutum antes de Pardal:
# vi teste-comm
6. Rode a comparação novamente:
# comm teste-comm teste-comm2
Aparecerá a palavra Mutum na primeira coluna, significando que essa linha spo existe no arquivo teste-comm, e na terceira coluna aparecerão as linhas em comum.
7. Altere o arquivo teste-comm2, adicionando a palavra Gaivota antes de Mutum.
Rode a comparação novamente e veja os resultados:
# comm teste-comm teste-comm2
8. Se estivermos interessados somente nas linhas que são idênticas em ambos os arquivos, podemos suprimir a exibição das colunas 1 e 2:
# comm -12 teste-comm teste-comm2
9. E, finalmente, se quisermos ver somente as diferenças entre os arquivos, excluimos a coluna 3 dos resultados:
# comm -3 teste-comm teste-comm2
Comando diff
Podemos comparar arquivos de texto com o comando diff (mas não arquivos binários).
A saída do comando diff traz as seguintes informações:
- Linhas que são diferentes no primeiro arquivo
- Código de ação: “O que deve ser feito para que os arquivos se tornem idênticos”: a para adicionar linhas após, c para modificar linhas e d para excluir linhas.
- Linhas que são diferentes no segundo arquivo.
Alguns flags úteis:
-b
Considerar que mais de um espaço ou tabulações sejam consideradas como um único caractere.
-i
Comparar os arquivos ignorando maiúsculas e minúsculas.
-l
Para gerar saída formatada, com um sumário no final.
-w
Ignorar todos os caracteres de espaço e tabulação.
Exemplo:
1. Execute o comando a seguir para comparar os arquivos teste-comm e teste-comm2:
# diff teste-comm teste-comm2
Será retornado o resultado a seguir:
3c3 < Mutum --- > Gaivota
Isso significa que devemos modificar a linha 3 no primeiro arquivo pela linha 3 do segundo para que se tornem idênticos. Ou seja, alterar Mutum para Gaivota.
2. Vamos introduzir mais modificações nos arquivos. Em teste-comm acrescente a linha “João-de-Barro” antes de Mutum, e rode novamente o teste:
# diff teste-comm teste-comm2
Aparecerá o resultado a seguir:
3,4c3 < Mutum --- > Gaivota
Significa: “modifique as linhas de 3 a 4 no arquivo1 para o valor da linha 3 do arquivo2, assim eles ficarão idênticos”.
3. Modifiquemos agora o arquivo teste-comm2. Acrescente a linha “Tico-tico” antes do Tucano e rode o teste novamente:
# diff teste-comm teste-comm2
Aparecerá o resultado a seguir:
3,4c3 < João-de-Barrp < Mutum --- > Gaivota 6a6 > Tico-tico
Significa: “modifique as linhas de 3 a 4 no arquivo1 para o valor da linha 3 do arquivo2, e adicione após a linha 6 do arquivo 1 o conteúdo da linha 6 do arquvo 2, assim eles ficarão idênticos”.
Para entender melhor essa saída, limpe a tela e digite os comandos a seguir para exibir o conteúdo dos dois arquivos e contar a linhas para compará-las:
# cat teste-comm # cat teste-comm2
Veja que adicionando após a sexta linha de teste-comm (Sabiá) a palavra Tico-tico, o arquivo ficará idêntico ao teste-comm2, cuja 6 linha é a palavra Tico-tico também.
4. Podemos também usar o comando diff para comparar o conteúdo em dois diretórios distintos. Para isso, crie os diretórios dir1 e dir2:
# mkdir dir1 dir2 # ls
5. Copie os arquivos teste-comm e teste-comm2 para ambos os diretórios:
# cp teste* ./dir1 # cp teste* ./dir2 # ls ./dir1 # ls ./dir2
6. Rode a comparação entre os diretórios com o diff:
# diff dir1 dir2
Nada aparecerá, pois ambos possuem o mesmo conteúdo. Agora apague teste-comm2 do diretório dir2:
# rm ./dir2/teste-comm2 # ls ./dir2
E rode novamente a comparação:
# diff dir1 dir2
Aparecerá a mensagem: “Somente em dir1: teste-comm2“, indicando que esse arquivo só está presente no diretório dir1.
Com a opção -s podemos ver quais arquivos são idênticos também:
# diff -s dir1 dir2
Comando sdiff
O comando sdiff compara dois arquivos e mostra na saída uma tabela com informações sobre a comparação:
- Se linhas forem idênticas, são mostradas em cada lado da tabela, separadas apenas por espaços.
- Se uma linha existe apenas no arquivo1, um sinal < é mostrado no final da linha da tabela.
- Se uma linha existe apenas no segundo arquivo, um sinal > é mostrado.
- Se duas linhas forem diferentes, uma barra de pipe | é mostrada entre elas
Algumas opções:
-s
Não mostrar linhas idênticas
Testando:
1. Execute o comando a seguir:
# sdiff teste-comm teste-comm2
2. Usando flags:
Mostrar somente linhas diferentes:
# sdiff -s teste-comm teste-comm2
É isso aí!
Escreva um comentário