Ubuntu sort, uniq, cut, wc, tr

Estes cinco comandos são peças pequenas: cada um faz uma coisa só com texto. Sozinhos parecem simples demais. Encaixados com o | (pipe), respondem perguntas como "qual IP mais acessou meu site?" ou "quais palavras se repetem nesta lista?", sem planilha e sem programar.

Você vai aprender
  • wc para contar linhas, palavras e bytes.
  • sort para ordenar, inclusive números e tamanhos como "1,5G".
  • uniq para remover ou contar repetições, e por que ele precisa do sort antes.
  • cut para recortar colunas e tr para trocar caracteres.
  • A receita mais famosa do terminal: sort | uniq -c | sort -nr.

Vamos usar o arquivo frutas.txt, que tem uma fruta por linha:

$ cat frutas.txt
banana
maçã
laranja
banana
uva
maçã
banana

wc: contar

wc vem de word count, "contagem de palavras", mas conta mais que isso.

wc
O programa que conta.
frutas.txt
O arquivo a contar.
$ wc frutas.txt
 7  7 47 frutas.txt
 « linhas · palavras · bytes · nome

A resposta tem quatro colunas: 7 linhas, 7 palavras, 47 bytes e o nome do arquivo. Quase sempre você quer só uma delas:

OpçãoContaExemploSaída
-lLinhas (lines)wc -l frutas.txt7 frutas.txt
-wPalavras (words)wc -w frutas.txt7 frutas.txt
-cByteswc -c frutas.txt47 frutas.txt
-mCaractereswc -m frutas.txt43 frutas.txt
Por que bytes e caracteres dão números diferentes?

Letras com acento ocupam 2 bytes. "maçã" tem 4 caracteres, mas 6 bytes (o ç e o ã valem 2 cada). Para contar letras, use -m.

Só o número, sem o nome

Se o texto chega pela entrada (com < ou por um pipe), o wc não sabe o nome do arquivo e mostra só o número. Isso é ótimo em scripts:

$ wc -l < frutas.txt
7
$ ls Downloads | wc -l
5                                    « 5 itens na pasta Downloads

Missão: descubra quantas linhas tem o arquivo Documentos/acesso.log e quantos itens há dentro da pasta Downloads.


sort: ordenar

sort
O programa que ordena linhas.
frutas.txt
O arquivo. O original não muda: o resultado só aparece na tela.
$ sort frutas.txt
banana
banana
banana
laranja
maçã
maçã
uva

O sort segue a ordem do dicionário em português: ele entende acentos e trata maiúsculas e minúsculas juntas. Para salvar o resultado, use sort frutas.txt > ordenado.txt, ou -o para gravar no próprio arquivo: sort -o frutas.txt frutas.txt.

Uma opção por vez

-r (reverse) inverte a ordem:

$ sort -r frutas.txt
uva
maçã
maçã
laranja
banana
banana
banana

-u (unique) mostra cada linha uma vez só:

$ sort -u frutas.txt
banana
laranja
maçã
uva

-n (numeric) ordena pelo valor do número. Sem ele, o sort compara caractere por caractere, e "10" vem antes de "2" porque "1" vem antes de "2":

$ cat notas-prova.txt
3
10
2
$ sort notas-prova.txt
10                                   « errado para números
2
3
$ sort -n notas-prova.txt
2
3
10

-h (human) entende tamanhos como 12K, 200M, 1,5G. Combina perfeitamente com du -h (veja lsblk, df, du):

$ du -sh Downloads/* | sort -h
48K     Downloads/foto.jpg
2,4M    Downloads/manual.pdf
5,1M    Downloads/musica.mp3
101M    Downloads/fotos-viagem.zip
5,9G    Downloads/ubuntu-26.04-desktop-amd64.iso

Ordenar por uma coluna: -t e -k

O arquivo /etc/passwd tem uma conta por linha, com campos separados por :. O terceiro campo é o número do usuário (UID). Para ordenar por ele:

sort
O programa.
-t:
O separador de colunas é : (de field separator).
-k3
Ordene pela coluna 3 (de key, "chave").
-n
Como número.
/etc/passwd
O arquivo.
$ sort -t: -k3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ana:x:1000:1000:Ana:/home/ana:/bin/bash

Sem -t, as colunas são separadas por espaços. O seu /etc/passwd real tem bem mais linhas; aqui mostramos só algumas.


uniq: repetições

uniq (de unique, "único") junta linhas repetidas. Mas há um detalhe que pega todo mundo: ele só compara cada linha com a anterior. Repetições separadas não são vistas:

$ uniq frutas.txt
banana
maçã
laranja
banana                               « continua repetida: não estava colada na outra
uva
maçã
banana

Por isso o uniq quase sempre vem depois do sort: ordenado, tudo o que é igual fica junto.

$ sort frutas.txt | uniq
banana
laranja
maçã
uva

Contar, só repetidas, só únicas

OpçãoO que mostraResultado com as frutas
-cCada linha com a quantidade na frente (count)3 banana, 1 laranja, 2 maçã, 1 uva
-dSó as que se repetem (duplicated)banana, maçã
-uSó as que aparecem uma vez (unique)laranja, uva
$ sort frutas.txt | uniq -c
      3 banana
      1 laranja
      2 maçã
      1 uva

A receita do ranking: sort | uniq -c | sort -nr

"O que aparece mais vezes?" Esta é provavelmente a combinação mais útil do terminal. Leia da esquerda para a direita, como uma linha de montagem:

sort frutas.txt
Ordena, para que as linhas iguais fiquem juntas.
| uniq -c
Junta as iguais e põe a quantidade na frente.
| sort -nr
Ordena pela quantidade (-n), da maior para a menor (-r).
$ sort frutas.txt | uniq -c | sort -nr
      3 banana                       « campeã
      2 maçã
      1 uva
      1 laranja

Acrescente | head -3 no fim para ver só o "top 3".

Na vida real: quem mais acessou o site?

No acesso.log, o IP é o primeiro pedaço de cada linha. O cut (próxima seção) extrai esse pedaço, e a receita faz o resto:

$ cut -d " " -f 1 Documentos/acesso.log | sort | uniq -c | sort -nr
      3 192.168.0.10
      2 192.168.0.23
      1 192.168.0.57

Missão: monte o ranking de IPs de Documentos/acesso.log e salve o resultado em ranking.txt. Dica: construa aos poucos. Rode só o cut, depois acrescente | sort, depois | uniq -c, e assim por diante, até o > ranking.txt.


cut: recortar colunas

cut ("cortar") pega só um pedaço de cada linha.

cut
O programa.
-d:
O delimitador, o caractere que separa os campos (de delimiter).
-f1
Qual campo pegar (de field). Pode ser -f1,3 ou -f2-4.
/etc/passwd
O arquivo.
$ cut -d: -f1 /etc/passwd
root
daemon
www-data
ana
$ cut -d: -f1,3 /etc/passwd
root:0
daemon:1
www-data:33
ana:1000

Com -c (de characters), ele recorta por posição em vez de campo:

$ cut -c 1-3 frutas.txt
ban
maç
lar
ban
uva
maç
ban
O cut não entende "vários espaços"

Para o cut -d " ", cada espaço separa um campo. Em textos alinhados com vários espaços (como a saída do ls -l ou do ps aux), os campos ficam vazios e o resultado sai errado. Nesses casos, use awk '{print $2}' (veja awk) ou espreme os espaços antes com tr -s " ".


tr: trocar caracteres

tr (de translate, "traduzir") troca um caractere por outro. Ele não lê arquivos pelo nome: o texto precisa chegar pela entrada, com | ou <.

tr
O programa.
a-z
Primeiro conjunto: o que procurar (todas as minúsculas).
A-Z
Segundo conjunto: pelo que trocar, posição por posição (a→A, b→B…).
$ echo "Olá Mundo" | tr a-z A-Z
OLá MUNDO                            « o á não mudou

A faixa a-z só tem as 26 letras sem acento. Letras acentuadas ficam como estão.

Apagar e espremer

FormaO que fazExemploSaída
tr X YTroca X por Yecho "a-b-c" | tr - _a_b_c
tr -d XApaga X (delete)echo banana | tr -d abnn
tr -s XEspreme X repetido num só (squeeze)echo "a b" | tr -s " "a b

Um truque útil: ver cada pasta do PATH numa linha, trocando : por quebra de linha (\n):

$ echo $PATH | tr ":" "\n"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

Outros três que valem conhecer

ComandoO que fazExemplo
pasteJunta arquivos lado a lado, linha com linhapaste -d, nomes.txt idades.txt
revInverte cada linha, caractere por caractereecho Ubuntu | rev → utnubU
diffMostra as diferenças entre dois arquivosdiff -u antes.txt depois.txt
$ paste -d, nomes.txt idades.txt
ana,25
beto,31
carla,19
$ diff -u lista-antiga.txt lista-nova.txt
--- lista-antiga.txt	2026-10-15 10:20:16.818430700 -0300
+++ lista-nova.txt	2026-10-15 10:25:02.104118300 -0300
@@ -1,3 +1,4 @@
 pão
-leite                               « "-" = só no arquivo antigo
+leite desnatado                     « "+" = só no arquivo novo
 ovos
+café

Formas diferentes de fazer

Remover linhas duplicadas

FormaDiferença
sort -u arquivoMais curta. O resultado sai ordenado.
sort arquivo | uniqMesmo resultado; permite trocar por uniq -c, -d ou -u.
awk '!visto[$0]++' arquivoRemove duplicadas mantendo a ordem original. Veja awk.

Contar linhas

FormaQuando
wc -l arquivoO jeito padrão.
wc -l < arquivoQuer só o número, sem o nome (scripts).
grep -c padrão arquivoQuer contar só as linhas que contêm algo.

Pegar uma coluna

FormaQuando
cut -d: -f1Separador de um caractere só, sempre igual (CSV, /etc/passwd).
awk '{print $1}'Colunas separadas por quantidade variável de espaços (ps, ls -l, df).

Missão: salve em unicas.txt só as frutas que aparecem uma única vez em frutas.txt. Dica: sort e depois uniq com a opção certa.


Quando não funciona

O uniq não removeu as repetidas
$ uniq frutas.txt | wc -l
7                                    « as mesmas 7 linhas

O que aconteceu: as linhas iguais não estavam coladas. O uniq só compara com a linha anterior.

Como resolver: ordene antes: sort frutas.txt | uniq, ou simplesmente sort -u frutas.txt.

O sort colocou 10 antes de 2

O que aconteceu: sem -n, os números são comparados como texto. Para tamanhos como 2,4M e 1,5G, a opção é -h.

O cut devolveu a linha inteira
$ cut -d, -f1 /etc/hostname
notebook

O que aconteceu: a linha não tem o delimitador (,). Quando não acha o separador, o cut devolve a linha inteira.

Como resolver: confira qual é o separador real do arquivo (:, ,, tabulação…). Com -s, o cut ignora as linhas sem delimitador.

"cut: uso inválido"
$ cut frutas.txt
cut: uso inválido: espera-se uma das opções --fields (-f), --chars (-c) ou --bytes (-b)

Como resolver: diga o que recortar: -f (campos), -c (caracteres) ou -b (bytes).

"tr: missing operand"
$ echo "teste" | tr a
tr: missing operand after 'a'
Two strings must be given when translating.
Try 'tr --help' for more information.

O que aconteceu: para trocar, o tr precisa de dois conjuntos: o que procurar e pelo que trocar. A mensagem sai em inglês no Ubuntu 26.04.

Como resolver: tr a b para trocar, ou tr -d a para apagar.

"No such file or directory"
$ sort lista.txt
sort: cannot read: lista.txt: No such file or directory
$ uniq -c lista.txt
uniq: Não foi possível abrir lista.txt: No such file or directory
$ wc -l lista.txt
wc: lista.txt: No such file or directory

O que aconteceu: o arquivo não está na pasta atual. Repare que cada comando escreve a mensagem de um jeito, misturando português e inglês: são do coreutils em Rust do Ubuntu 26.04.

Como resolver: confira o nome com ls e use Tab para completar.


Referência de opções

wc

OpçãoDescrição
-lLinhas
-wPalavras
-cBytes
-mCaracteres
-LTamanho da linha mais longa

sort

OpçãoDescriçãoExemplo
-rOrdem inversasort -r
-nNuméricasort -n
-hTamanhos legíveis (K, M, G)du -sh * | sort -h
-uRemove duplicadassort -u
-fIgnora maiúsculassort -f
-t XSeparador de colunassort -t,
-k NOrdena pela coluna Nsort -k2
-o arqGrava o resultado no arquivosort -o a.txt a.txt

uniq

OpçãoDescrição
-cConta as repetições
-dSó as linhas repetidas
-uSó as linhas que aparecem uma vez
-iIgnora maiúsculas

cut

OpçãoDescriçãoExemplo
-d XDelimitador (padrão: tabulação)-d:
-fCampos: 1, 1,3, 2-4, 3--f1,3
-cCaracteres por posição-c 1-10
-sIgnora linhas sem delimitador-s

tr

FormaDescrição
tr a-z A-ZTroca cada caractere do 1º conjunto pelo correspondente no 2º
tr "[:lower:]" "[:upper:]"Mesma coisa, com classes nomeadas
tr -d XApaga os caracteres
tr -s XEspreme repetições

Exercícios

1. Só o número de linhas

Complete para contar as linhas de notas.txt:

wc notas.txt

2. O ranking

Complete a receita que mostra o que mais se repete, do maior para o menor:

sort lista.txt | uniq | sort

3. Segundo campo de um CSV

O arquivo clientes.csv tem linhas como ana,ana@email.com,SP. Complete para pegar só os e-mails:

cut -d -f clientes.csv

4. Por que uniq geralmente vem depois de sort?

5. Qual comando transforma "ubuntu" em "UBUNTU"?


Resumo

  • wc -l conta linhas; com < ou pipe, mostra só o número.
  • sort ordena; -n para números, -h para tamanhos, -r inverte, -u remove duplicadas.
  • uniq só vê repetições coladas; use sort antes. -c conta.
  • Ranking: sort | uniq -c | sort -nr | head.
  • cut -d X -f N recorta colunas com separador fixo; para espaços variáveis, use awk.
  • tr troca (a-z A-Z), apaga (-d) e espreme (-s) caracteres, lendo da entrada.