De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 3 de setembro de 2026
Em sistemas Linux, arquivos de log e listas de processos podem conter centenas ou milhares de linhas. Encontrar os eventos mais recentes, os processos que consomem mais memória ou as mensagens que aparecem com maior frequência pode ser trabalhoso quando os dados estão desorganizados. O comando sort transforma essas listagens em informações muito mais fáceis de analisar.
Embora sua função básica seja ordenar linhas de texto, o sort também entende números, tamanhos escritos como 10M ou 2G, meses, campos delimitados e diferentes critérios de desempate. Combinado com comandos como ps, journalctl, awk, cut e uniq, ele se torna uma ferramenta muito útil para administração e diagnóstico de sistemas.
Para colocar as linhas de um arquivo em ordem alfabética, basta informar seu nome:
$ sort aplicacao.log
O conteúdo ordenado é exibido na tela. O arquivo original permanece inalterado.
Para gravar o resultado em outro arquivo, use a opção -o:
$ sort aplicacao.log -o aplicacao-ordenada.log
Também seria possível usar o redirecionamento:
$ sort aplicacao.log > aplicacao-ordenada.log
Nunca redirecione a saída diretamente para o próprio arquivo de entrada:
$ sort aplicacao.log > aplicacao.log
Nesse caso, o shell pode esvaziar o arquivo antes que o sort consiga lê-lo. Quando for necessário substituir o original, use a opção -o:
$ sort -o aplicacao.log aplicacao.log
Logs que começam com datas no formato AAAA-MM-DD são particularmente fáceis de ordenar. Considere o seguinte conteúdo:
2026-09-03 08:15:10 INFO Serviço iniciado 2026-09-01 19:42:08 ERROR Falha de autenticação 2026-09-02 11:20:31 WARNING Espaço em disco reduzido
A ordem alfabética coincide com a ordem cronológica:
$ sort aplicacao.log
Para mostrar primeiro os eventos mais recentes, acrescente -r, que inverte a ordem:
$ sort -r aplicacao.log
Se todas as linhas seguirem o mesmo padrão de data e hora, essa solução é simples e confiável.
Alguns arquivos, como /var/log/syslog e /var/log/messages, podem começar com o mês abreviado:
Sep 2 09:18:01 servidor sshd[3120]: conexão aceita Aug 28 14:07:33 servidor kernel: dispositivo conectado Sep 1 22:41:09 servidor systemd[1]: serviço iniciado
Para ordenar pelo mês, dia e horário, podemos definir campos sucessivos:
$ sort -k1,1M -k2,2n -k3,3 /var/log/syslog
Nesse comando:
-k1,1M ordena o primeiro campo como nome de mês;
-k2,2n ordena numericamente o dia;
-k3,3 usa o horário como terceiro critério.
A letra M reconhece abreviações de meses, enquanto n solicita uma comparação numérica.
Existe, porém, uma limitação importante: o formato tradicional do syslog normalmente não apresenta o ano. Se o arquivo reunir registros de anos diferentes, o sort não terá informações suficientes para produzir uma ordem cronológica perfeita.
Nem sempre é necessário ordenar todo o arquivo. Podemos selecionar primeiro apenas as linhas relevantes:
$ grep 'ERROR' aplicacao.log | sort
Para ignorar diferenças entre letras maiúsculas e minúsculas:
$ grep -i 'error' aplicacao.log | sort
Também podemos combinar vários padrões:
$ grep -E 'ERROR|WARNING' aplicacao.log | sort
Essa estratégia reduz a quantidade de dados processados e torna o resultado mais objetivo.
O comando uniq -c conta linhas repetidas consecutivas. Por isso, normalmente usamos sort antes dele:
$ sort aplicacao.log | uniq -c
Para colocar as ocorrências mais frequentes no início:
$ sort aplicacao.log |\
uniq -c |\
sort -nr
A primeira ordenação agrupa as linhas iguais. O uniq -c conta cada grupo, e o segundo sort organiza as contagens numericamente em ordem decrescente.
Em logs de serviços, valores variáveis como data, horário e número do processo podem impedir que mensagens equivalentes sejam consideradas iguais. Podemos remover esses campos antes da contagem. Em um log no formato tradicional do syslog, por exemplo:
awk '{$1=$2=$3=$4=""; sub(/^ +/, ""); print}' /var/log/syslog |
sort |
uniq -c |
sort -nr |
head
Esse pipeline remove os quatro primeiros campos e mostra as dez mensagens restantes mais frequentes. O formato exato deve ser ajustado ao arquivo analisado.
O comando ps produz uma fotografia dos processos no instante em que é executado. Para descobrir quais deles usam mais memória, podemos selecionar campos específicos e ordenar numericamente pela coluna correspondente:
$ ps -eo pid,user,%mem,rss,comm --no-headers |\
sort -k3,3nr |\
head
Nesse exemplo:
pid mostra o identificador do processo;
user informa seu proprietário;
%mem apresenta o percentual de memória utilizado;
rss mostra a memória residente em KiB;
comm exibe o nome do comando;
-k3,3nr ordena numericamente a terceira coluna, em ordem decrescente;
head limita a saída aos dez primeiros resultados.
A opção --no-headers impede que o cabeçalho seja misturado aos dados. Se desejarmos acrescentar um cabeçalho ao resultado, podemos fazer:
{
printf '%-8s %-12s %6s %10s %s\n' PID USUÁRIO '%MEM' RSS COMANDO
ps -eo pid,user,%mem,rss,comm --no-headers |
sort -k3,3nr |
head
}
Para localizar os processos que mais utilizam o processador:
$ ps -eo pid,user,%cpu,%mem,comm --no-headers |\
sort -k3,3nr |\
head
A terceira coluna é %cpu, portanto ela é escolhida pela expressão -k3,3. As letras n e r determinam, respectivamente, ordenação numérica e inversa.
O resultado representa apenas o momento da coleta. Para acompanhamento contínuo, ferramentas como top, htop ou pidstat são mais apropriadas.
Podemos usar a opção --sort do próprio ps ou enviar sua saída ao sort. Quando os valores incluem unidades como K, M e G, a opção -h é especialmente útil:
$ ps -eo pid,user,rss,comm --no-headers |\
awk '{
rss=$3
$1=$2=$3=""
sub(/^ +/, "")
printf "%d\t%s\t%.1fMiB\t%s\n", NR, $2, rss/1024, $0
}'
Em situações nas quais a entrada já apresenta tamanhos legíveis, a ordenação pode ser feita assim:
$ sort -k3,3hr processos.txt
A opção -h, de "human numeric sort", interpreta corretamente valores como:
850K 12M 1.5G
Sem -h, esses valores seriam tratados apenas como texto e poderiam aparecer em uma ordem incorreta.
O campo etimes do ps informa há quantos segundos um processo está em execução. Para mostrar primeiro os processos mais antigos:
$ ps -eo pid,user,etimes,comm --no-headers |\
sort -k3,3nr |\
head
Para mostrar os processos iniciados mais recentemente:
$ ps -eo pid,user,etimes,comm --no-headers |\
sort -k3,3n |\
head
Também podemos solicitar ao ps uma data completa de início e preservar um valor numérico para a ordenação:
$ ps -eo pid,user,lstart,etimes,comm --no-headers |\
sort -k8,8n
Nesse formato, lstart ocupa cinco campos. Por isso, etimes aparece na oitava coluna. Essa dependência da posição dos campos mostra por que é importante examinar a saída antes de definir a chave de ordenação.
Se dois processos apresentarem o mesmo consumo de CPU, podemos usar a memória como critério de desempate:
$ ps -eo pid,user,%cpu,%mem,comm --no-headers |\
sort -k3,3nr -k4,4nr
O sort compara primeiro a terceira coluna. Quando os valores são iguais, ele utiliza a quarta.
Outro exemplo consiste em agrupar os processos pelo usuário e, dentro de cada grupo, ordená-los pelo consumo de memória:
$ ps -eo user,pid,%mem,comm --no-headers |\
sort -k1,1 -k3,3nr
A primeira chave usa ordem alfabética. A segunda usa ordem numérica decrescente.
Espaços em branco funcionam bem em muitas listagens, mas campos que contêm espaços podem dificultar a identificação das colunas. Uma solução é produzir dados com um delimitador conhecido, como o caractere |:
$ ps -eo pid=,user=,%cpu=,%mem=,comm= |\
awk '{
printf "%s|%s|%s|%s|%s\n", $1, $2, $3, $4, $5
}' |\
sort -t'|' -k3,3nr
A opção -t'|' informa que a barra vertical separa os campos. A chave -k3,3nr continua ordenando a terceira coluna numericamente e em ordem inversa.
Essa técnica é particularmente útil em scripts, pois torna a estrutura dos dados mais explícita.
Como a lista de processos muda constantemente, pode ser útil registrar uma fotografia para análise posterior:
$ ps -eo pid,ppid,user,%cpu,%mem,rss,etimes,comm > processos.txt
Depois, o arquivo pode ser examinado e ordenado de várias maneiras:
$ sort -k4,4nr processos.txt
Entretanto, nesse caso o cabeçalho também será processado. Para preservar o cabeçalho, uma alternativa é armazenar apenas os dados:
$ ps -eo pid,ppid,user,%cpu,%mem,rss,etimes,comm --no-headers \
> processos.txt
Em seguida:
$ sort -k4,4nr processos.txt | head
A localidade do sistema pode influenciar a ordem alfabética, o reconhecimento dos meses e a interpretação de determinados caracteres. Em scripts que precisam produzir resultados consistentes em máquinas diferentes, é comum definir LC_ALL=C apenas para o comando:
$ LC_ALL=C sort arquivo.log
Essa configuração usa regras simples e previsíveis de comparação de bytes. Contudo, ao ordenar nomes de meses, é necessário considerar o idioma usado no log. Meses em português e em inglês podem exigir uma localidade compatível.
As opções mais importantes nesses cenários são:
| Opção | Significado |
|---|---|
-n |
ordena numericamente |
-r |
inverte a ordem |
-h |
reconhece tamanhos como K, M, G e T |
-M |
reconhece nomes abreviados de meses |
-k |
define a chave de ordenação |
-t |
define o delimitador dos campos |
-u |
mantém apenas uma ocorrência de cada linha |
-f |
ignora diferenças entre maiúsculas e minúsculas |
-o |
grava o resultado em um arquivo |
-s |
mantém estável a ordem das linhas consideradas iguais |
Por exemplo, para remover linhas duplicadas de um log:
$ sort -u aplicacao.log
Para ordenar sem diferenciar letras maiúsculas de minúsculas:
$ sort -f aplicacao.log
O comando sort é muito mais do que um simples organizador alfabético. Ele permite transformar logs extensos e listagens de processos em informações úteis para diagnóstico, auditoria e acompanhamento do sistema.
A chave está em identificar corretamente as colunas, escolher o tipo de comparação adequado e ordenar apenas os dados relevantes. Datas no formato ISO podem ser tratadas como texto, percentuais e tempos exigem ordenação numérica, tamanhos legíveis pedem a opção -h, e análises por frequência normalmente combinam sort com uniq -c.
Com essas técnicas, tarefas como localizar erros recorrentes, descobrir os maiores consumidores de CPU e memória ou organizar registros cronologicamente podem ser executadas diretamente no terminal, sem a necessidade de ferramentas complexas.