Linux / Comando cat: exibir arquivos, juntar textos e numerar linhas

O comando cat lê arquivos e envia seus conteúdos à saída padrão, normalmente o terminal, na ordem indicada. Ele junta os bytes sem inserir espaços, separadores ou quebras de linha extras. É útil para textos curtos e combinações simples; para navegar e pesquisar em um arquivo longo, less costuma ser mais adequado.

Os exemplos usam Bash e GNU Coreutils. A preparação cria arquivos pequenos em uma pasta exclusiva sob a pasta atual. Execute-a no mesmo terminal e pare se houver erro. Os nomes e os resultados são conhecidos, permitindo conferir a combinação e os efeitos das opções sem alterar uma configuração real do sistema.

O nome vem de concatenate, isto é, concatenar ou unir em sequência. Sem arquivos, cat lê a entrada padrão, que pode vir do teclado, de um pipe — uma ligação entre comandos — ou de um redirecionamento. O operando - também representa essa entrada. O comando normalmente não altera seus arquivos de entrada, mas o shell prepara redirecionamentos antes de executá-lo, podendo criar ou esvaziar o destino. O manual GNU de cat descreve as opções e essa seleção da entrada.

Sintaxe básica

cat [opções]... [arquivo]...

opções e arquivo são marcadores. Use aspas em caminhos com espaços e -- antes de nomes que poderiam ser interpretados como opções; para um arquivo chamado literalmente -, use ./-. Confira cat --version, cat --help e man cat no sistema de destino quando precisar de uma extensão específica.

Uso básico do cat

Exibir um arquivo

A preparação cria um arquivo de configuração de demonstração com cinco linhas, incluindo uma linha vazia e uma contendo somente três espaços. Também prepara partes, capítulos, caracteres de controle e um arquivo de controle para as práticas seguintes. Ao final, cat mostra todo o conteúdo de app.conf. A linha de espaços pode parecer vazia no terminal; as opções abaixo ajudam a distingui-la.

cat_start=$PWD
cat_demo=$(mktemp -d -p "$PWD" 'cat-demo.XXXXXXXX') &&
cd -- "$cat_demo" &&
printf 'enabled=true\n\npath=/tmp/demo\n   \nmode=safe\n' > app.conf &&
printf 'alfa' > part-01.txt &&
printf 'beta\n' > part-02.txt &&
printf 'Capítulo 1\n' > chapter-1.txt &&
printf 'Capítulo 2\n' > chapter-2.txt &&
printf 'campo\tvalor\r\n' > characters.txt &&
printf 'controle intacto\n' > sentinel.txt &&
cat -- app.conf

Concatenar vários arquivos

part-01.txt contém alfa sem uma quebra de linha final; part-02.txt contém beta e uma quebra de linha. A combinação abaixo mostra alfabeta em uma linha. A ordem dos operandos determina a ordem dos bytes; inverter os arquivos muda o resultado. Se precisar de um separador, inclua-o explicitamente nos dados ou na composição da saída.

cd -- "$cat_demo" &&
cat -- part-01.txt part-02.txt

Salvar a combinação em outro arquivo

O shell direciona a saída para book.txt. A prática usa uma subshell, o grupo entre parênteses, com set -C para recusar um arquivo regular de saída já existente; essa opção fica limitada ao grupo. A primeira execução cria os dois capítulos em sequência. Se o arquivo já existir, investigue e escolha outro nome em vez de remover a proteção automaticamente. O operador >> acrescenta ao final de um destino, mas também exige conferir o alvo.

cd -- "$cat_demo" &&
(set -C; cat -- chapter-1.txt chapter-2.txt > book.txt)

Conferir a saída padrão

Este exemplo cria outro arquivo pequeno e mostra duas linhas. As operações são ligadas por &&, para que a leitura só seja executada se a escrita funcionar. O bloco seguinte é a saída esperada, não um comando para executar.

cd -- "$cat_demo" &&
printf 'um\ndois\n' > sample.txt &&
cat -- sample.txt

Saída de exemplo:

um
dois

cat não faz paginação: ele continua enviando dados até o fim da entrada ou uma falha. Ler um arquivo existente não desfaz alterações feitas anteriormente por um redirecionamento. Compare o conteúdo e o estado de saída quando a combinação fizer parte de um processamento importante.

Principais opções

Opção Efeito na saída
-n Numerar todas as linhas de saída, começando em 1.
-b Numerar somente linhas não vazias; prevalece sobre -n, independentemente da ordem. Uma linha com espaços não é vazia.
-s Reduzir várias linhas vazias adjacentes a uma. Não remove toda linha vazia nem linhas contendo espaços.
-E Mostrar $ no fim de uma linha terminada por quebra. No GNU Coreutils 9.0 ou posterior, CRLF aparece como ^M$; em versões antigas, use -vE ou -A para revelar o retorno de carro. Não acrescenta uma quebra que estava ausente.
-T Mostrar tabulações como ^I, em vez de depender da largura visual de tabulação do terminal.
-A Equivaler a -vET: revelar controles, tabulações e finais de linha. A representação não altera o arquivo original.

Exemplos práticos

Revisar números de linha

No arquivo preparado, -n numera as cinco linhas; o alinhamento usa espaços e uma tabulação, que podem aparecer de forma diferente no terminal. Com cat -b -- app.conf, somente a linha realmente vazia fica sem número; a linha com três espaços recebe um. Esses números existem na saída, não são gravados no arquivo. Acrescentar -n junto com -b não passa a numerar as linhas vazias.

cd -- "$cat_demo" &&
cat -n -- app.conf

Revelar caracteres de controle

characters.txt foi criado com uma tabulação e um final CRLF: retorno de carro seguido de avanço de linha. Com a configuração de caracteres LC_ALL=C aplicada só a esta chamada, o resultado esperado é campo^Ivalor^M$ e uma quebra de linha. ^I representa o tabulador, ^M o retorno de carro e $ marca o fim. Esses sinais são uma visualização dos bytes, não caracteres que você deva inserir no arquivo para corrigir um problema. O exemplo usa -A, que inclui -v. O tratamento de CRLF como ^M$ apenas com -E foi acrescentado no GNU Coreutils 9.0; em versões anteriores, -vE torna o retorno de carro visível.

cd -- "$cat_demo" &&
LC_ALL=C cat -A -- characters.txt

Salvar dados recebidos pela entrada padrão

Sem arquivos como operandos, cat lê a entrada padrão. O exemplo completo usa um here-document, o texto entre dois delimitadores NOTA, para fornecer duas linhas de forma reproduzível. As aspas em 'NOTA' impedem expansões: $variavel deve permanecer literal no arquivo. A linha final NOTA fica sozinha, sem espaços antes ou depois. A subshell com set -C recusa um memo.txt regular já existente; depois da criação, o arquivo é lido para conferência.

cd -- "$cat_demo" &&
(
  set -C
  cat > memo.txt <<'NOTA'
Primeira linha.
Texto literal: $variavel
NOTA
) &&
cat -- memo.txt

Para digitação interativa, cat > memo.txt também lê do terminal, mas > pode esvaziar um destino existente. Em um terminal Linux no modo canônico habitual, Ctrl+D no início de uma linha sem dados pendentes indica fim da entrada; após texto ainda pendente, primeiro entrega esse texto ao programa. Isso depende da configuração do terminal, conforme termios e o caractere VEOF. Para editar e corrigir texto com mais controle, use um editor. O manual de redirecionamentos do Bash explica >, >>, noclobber e here-documents.

Comparar cat e outros comandos

Comando Função principal Quando usar
cat Exibir ou juntar os fluxos na ordem indicada Textos curtos ou composição de entradas
less Paginação e pesquisa interativas Navegar por arquivos longos
tac Inverter registros, separados por quebra de linha por padrão Ler linhas em ordem inversa; não ordenar por data
paste Juntar linhas correspondentes, com tabulação por padrão Combinar entradas em colunas

Cuidados importantes

Navegar por arquivos grandes

Enviar um arquivo extenso inteiro para o terminal dificulta localizar uma seção. Use paginação e pesquisa quando precisar navegar. Se quiser apenas o fim de um log, a leitura com tail pode ser suficiente, sem exibir o arquivo completo.

Conferir o destino antes de redirecionar

Em cat arquivo > arquivo, o shell pode esvaziar o arquivo antes de cat começar. Nomes diferentes também podem apontar ao mesmo conteúdo por links físicos ou simbólicos; comparar apenas os textos dos caminhos não basta. Escolha uma saída separada sob seu controle e só substitua um original depois de conferir o resultado. Uma falha pode deixar um arquivo de saída parcial. As práticas deixam os objetos para inspeção; volte à pasta anterior com cd -- "$cat_start".

Inspecionar bytes binários com ferramentas adequadas

Dados binários e sequências de controle inesperadas podem alterar a aparência do terminal. Use file para uma identificação inicial e uma visualização hexadecimal, como od -An -tx1 -- arquivo, quando precisar examinar bytes. cat -A ajuda a visualizar controles, mas não valida formato, codificação ou segurança de um arquivo.

Perguntas frequentes

O comando cat modifica o arquivo de entrada?

O uso normal lê e envia os dados à saída padrão. As opções de numeração e visualização transformam a saída, sem editar o conteúdo da entrada. Um redirecionamento do shell pode, porém, criar ou esvaziar o destino antes da leitura; evite qualquer destino que corresponda à própria entrada.

O comando cat adiciona separadores entre arquivos?

Não. Sem opções de transformação, ele junta os bytes na ordem indicada. Se o primeiro arquivo não terminar em quebra de linha, o início do segundo pode aparecer na mesma linha. Inclua o separador necessário explicitamente.

Como mostrar números de linha?

Use -n para todas as linhas ou -b para linhas não vazias. -b prevalece sobre -n; uma linha contendo somente espaços continua sendo não vazia. A numeração é adicionada apenas à saída.

Devo usar cat para um log muito longo?

É possível, mas less permite navegar e pesquisar com mais facilidade. Se a pergunta se refere apenas às últimas linhas, considere tail. Escolha o comando pelo trecho e pela forma de leitura de que você precisa.