Guia Prático do comm no Linux: Comparando Arquivos

Visão Geral

Examinar discrepâncias e similaridades entre conjuntos de dados textuais no terminal Linux é uma rotina essencial para administradores e desenvolvedores. O utilitário comm destaca-se por sua capacidade de confrontar rapidamente dois arquivos previamente ordenados linha por linha. Neste tutorial, exploramos a mecânica da exibição dividida em três colunas, a aplicação prática de filtros para operações de conjuntos (interseções e diferenças) e técnicas eficientes para lidar com fluxos não ordenados em cenários reais.

1. Mecânica Operacional do comm e a Estrutura de Três Colunas

Para isolar nossos testes práticos, preparamos uma pasta dedicada por meio do comando mkdir -p ~/comm_lab && cd ~/comm_lab.

mkdir -p ~/comm_lab && cd ~/comm_lab

Criamos a primeira fonte de dados ordenada alfabeticamente, denominada fruits_a.txt, executando printf "apple\nbanana\ncherry\nmango\n" > fruits_a.txt.

printf “apple\nbanana\ncherry\nmango\n” > fruits_a.txt

Em seguida, definimos o segundo arquivo de teste fruits_b.txt contendo registros parcialmente coincidentes com printf "banana\ncherry\norange\nwatermelon\n" > fruits_b.txt.

printf “banana\ncherry\norange\nwatermelon\n” > fruits_b.txt

Ao processar dois arquivos de texto ordenados, o utilitário comm organiza sua resposta visual distribuindo as linhas em três colunas bem definidas:
A primeira coluna (alinhada à esquerda, sem tabulação) exibe as linhas exclusivas do primeiro arquivo; a segunda coluna (com uma tabulação de recuo) isola os registros presentes unicamente no segundo arquivo; a terceira coluna (com duas tabulações) evidencia as linhas compartilhadas por ambos.
⚙️ [Parâmetros Essenciais]

-1 : Omite da listagem a primeira coluna (elementos exclusivos do primeiro arquivo).
-2 : Suprime da saída a segunda coluna (elementos exclusivos do segundo arquivo).
-3 : Oculta a terceira coluna (itens em comum em ambos os arquivos).
--check-order : Força a validação da sequência de ordenação antes do processamento.
--nocheck-order : Desabilita a verificação de ordenação prévia das entradas.
--output-delimiter=STR : Substitui o caractere de tabulação padrão pela sequência delimitadora fornecida (STR).

comm fruits_a.txt fruits_b.txt

2. Filtragem de Interseções e Diferenças com Modificadores Numéricos

Acessamos novamente o ambiente do laboratório executando cd ~/comm_lab.

cd ~/comm_lab

Ao aplicar comm -12, descartam-se as colunas 1 e 2, mantendo apenas a intersecção exata dos dois documentos.
Como resultado direto, o terminal lista exclusivamente os termos banana e cherry.

comm -12 fruits_a.txt fruits_b.txt

Com a combinação comm -23, as colunas 2 e 3 são suprimidas para destacar unicamente o conjunto de linhas pertencentes ao primeiro arquivo.
Apenas os itens apple e mango permanecem visíveis na tela.

comm -23 fruits_a.txt fruits_b.txt

Inversamente, a sintaxe comm -13 ignora as colunas 1 e 3 para isolar os elementos exclusivos da segunda fonte de dados.
O comando exibe somente as entradas orange e watermelon.

comm -13 fruits_a.txt fruits_b.txt

3. Confrontando Arquivos Desordenados com Substituição de Processos no Bash

Garantimos o posicionamento correto no diretório com cd ~/comm_lab.

cd ~/comm_lab

Para simular listas sem ordenação lexicográfica, geramos unsorted_a.txt via printf "zebra\napple\ngrape\n" > unsorted_a.txt.

printf “zebra\napple\ngrape\n” > unsorted_a.txt

De forma equivalente, criamos unsorted_b.txt contendo entradas fora de ordem por meio de printf "apple\norange\nzebra\n" > unsorted_b.txt.

printf “apple\norange\nzebra\n” > unsorted_b.txt

A construção comm <(sort unsorted_a.txt) <(sort unsorted_b.txt) tira proveito da substituição de processos do Bash (<(...)), alimentando o comm com os fluxos já organizados em memória, eliminando a criação de arquivos intermediários no disco.
Na saída resultante, o processamento distribui coerentemente grape na coluna 1, orange na coluna 2 e os valores idênticos apple e zebra na coluna 3.

comm <(sort unsorted_a.txt) <(sort unsorted_b.txt)

Combinando essa técnica com a supressão de colunas, a instrução comm -12 <(sort unsorted_a.txt) <(sort unsorted_b.txt) entrega diretamente a intersecção das duas listas desordenadas.
Sem necessidade de arquivos temporários, recuperamos limpa e rapidamente os termos comuns apple e zebra.

comm -12 <(sort unsorted_a.txt) <(sort unsorted_b.txt)

4. Casos Práticos: Auditoria de Pacotes e Comparação Case-Insensitive

Navegamos para o diretório de exercícios executando cd ~/comm_lab.

cd ~/comm_lab

Para avaliar divergências de ambiente entre servidores, criamos a lista de pacotes server1_pkgs.txt com o comando printf "curl\ngit\nnginx\nvim\n" > server1_pkgs.txt.

printf “curl\ngit\nnginx\nvim\n” > server1_pkgs.txt

Registramos a relação de pacotes do segundo host em server2_pkgs.txt rodando printf "docker\ngit\npython3\nvim\n" > server2_pkgs.txt.

printf “docker\ngit\npython3\nvim\n” > server2_pkgs.txt

O comando comm -3 server1_pkgs.txt server2_pkgs.txt descarta a terceira coluna (itens em comum), evidenciando somente as discrepâncias de cada sistema (colunas 1 e 2).
Softwares instalados em ambos os hosts, como git e vim, são ocultados; figuram apenas curl e nginx (exclusivos do primeiro servidor) e docker e python3 (pertencentes apenas ao segundo).

comm -3 server1_pkgs.txt server2_pkgs.txt

Para demonstrar o comportamento com variações de caixa, criamos o arquivo de teste mixed_a.txt com printf "Apple\nBANANA\ncherry\n" > mixed_a.txt.

printf “Apple\nBANANA\ncherry\n” > mixed_a.txt

Em contrapartida, geramos mixed_b.txt contendo os mesmos termos em grafias com formatos alternados via printf "apple\nbanana\nCHERRY\n" > mixed_b.txt.

printf “apple\nbanana\nCHERRY\n” > mixed_b.txt

A linha de comando comm -12 --nocheck-order <(sort -f mixed_a.txt) <(sort -f mixed_b.txt) emprega sort -f para ordenar as listas ignorando o formato das letras, enquanto o parâmetro --nocheck-order impede que o comm aborte por inconsistências de ordenação padrão.
Entretanto, como o comm opera checagens literais byte a byte, as linhas não atingem correspondência binária exata e o comando encerra sem produzir saída visível.

comm -12 –nocheck-order <(sort -f mixed_a.txt) <(sort -f mixed_b.txt)

Dominar o comando comm amplia consideravelmente a agilidade no diagnóstico e na filtragem de relatórios, inventários e logs no ecossistema Linux.
Ao associar essa ferramenta a pipes, ordenações inteligentes com sort e seleções pontuais de colunas, você simplifica auditorias complexas com máxima precisão no terminal.