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.

Como ordenar logs e processos com o comando sort

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.

Ordenação básica de um arquivo de log

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 

Ordenando logs com datas no formato ISO

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.

Ordenando logs tradicionais do syslog

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.

Filtrando antes de ordenar

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.

Identificando as mensagens mais frequentes

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.

Ordenando processos pelo consumo de memória

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
}

Ordenando processos pelo consumo de CPU

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.

Ordenando processos pela memória em valores legíveis

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.

Ordenando processos pelo tempo de execução

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.

Ordenando por mais de um critério

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.

Usando um delimitador explícito

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.

Salvando uma fotografia dos processos

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 

Controlando a localidade

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.

Opções úteis para logs e processos

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 

Conclusão

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.



Veja a relação completa dos artigos de Rubens Queiroz de Almeida