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 datas e endereços IP com o "sort"

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 31 de agosto de 2026

O comando sort compara linhas de texto e, por isso, funciona melhor quando os dados já estão escritos em uma sequência que corresponde à ordem desejada. Essa característica explica por que algumas datas podem ser ordenadas diretamente, enquanto outras exigem a definição de várias chaves. O mesmo problema aparece com endereços IP, cujos números precisam ser comparados separadamente.

Compreender essa diferença permite usar o sort para organizar arquivos de registros, relatórios, históricos de acesso e diversas outras fontes de dados.

Ordenando datas no formato ISO

O formato internacional de data segue a estrutura:

 AAAA-MM-DD 

Esse formato apresenta os elementos do mais significativo para o menos significativo: ano, mês e dia. Por essa razão, a ordem textual também corresponde à ordem cronológica.

Considere o arquivo eventos.txt:

2026-08-15 Atualização do sistema
2024-12-03 Instalação do servidor
2026-01-20 Renovação do certificado
2025-06-11 Alteração da configuração

Para colocar os registros em ordem cronológica, basta executar:

$ sort -k1,1 eventos.txt 

Resultado:

2024-12-03 Instalação do servidor
2025-06-11 Alteração da configuração
2026-01-20 Renovação do certificado
2026-08-15 Atualização do sistema

Como todos os componentes possuem tamanho fixo e aparecem na ordem ano, mês e dia, a comparação textual produz o resultado correto.

Para mostrar os registros mais recentes primeiro:

$ sort -k1,1r eventos.txt 

O modificador r, de reverse, inverte a ordem.

Datas acompanhadas de horários

O mesmo princípio vale para registros que possuem data e hora em campos separados:

2026-08-25 10:31:15 servidor02 WARN
2026-08-25 09:12:03 servidor01 INFO
2026-08-24 23:58:44 servidor03 ERROR

Podemos ordenar primeiro pela data e depois pelo horário:

$ sort \
    -k1,1 \
    -k2,2 \
    log.txt

Resultado:

2026-08-24 23:58:44 servidor03 ERROR
2026-08-25 09:12:03 servidor01 INFO
2026-08-25 10:31:15 servidor02 WARN

Também podemos criar uma única chave que abranja os dois campos:

$ sort -k1,2 log.txt 

Para apresentar os registros mais recentes primeiro:

$ sort -k1,2r log.txt 

Isso funciona porque tanto a data quanto o horário estão escritos do componente mais significativo para o menos significativo.

O problema das datas no formato brasileiro

No Brasil, as datas normalmente são escritas no formato:

DD/MM/AAAA 

Nesse caso, uma ordenação textual começa pelo dia, depois considera o mês e somente no final examina o ano. O resultado não corresponde necessariamente à ordem cronológica.

Considere pagamentos.txt:

Ana;31/12/2025;1200
Carlos;05/01/2024;900
Beatriz;17/08/2025;1500
Daniel;03/02/2025;1100

Este comando não resolve o problema:

$ sort -t';' -k2,2 pagamentos.txt 

Como a comparação começa pelo dia, 03/02/2025 aparecerá antes de 05/01/2024, apesar de 2024 ser anterior a 2025.

A solução é selecionar separadamente o ano, o mês e o dia:

$ sort -t';' \
    -k2.7,2.10n \
    -k2.4,2.5n \
    -k2.1,2.2n \
    pagamentos.txt

Resultado:

Carlos;05/01/2024;900
Daniel;03/02/2025;1100
Beatriz;17/08/2025;1500
Ana;31/12/2025;1200

As chaves utilizadas são:

 -k2.7,2.10n 

Seleciona os caracteres de 7 a 10 do segundo campo, correspondentes ao ano.

 -k2.4,2.5n 

Seleciona os caracteres 4 e 5, correspondentes ao mês.

 -k2.1,2.2n 

Seleciona os dois primeiros caracteres, correspondentes ao dia.

O modificador n indica que cada parte deve ser comparada numericamente.

Essa solução pressupõe que todas as datas possuam dois algarismos para o dia, dois para o mês e quatro para o ano.

Criando uma chave auxiliar para as datas

Embora o comando anterior funcione, ele pode ser difícil de compreender e manter. Outra possibilidade consiste em converter temporariamente a data para o formato ISO:

$ awk -F';' '
{
    split($2, data, "/")

    printf "%04d-%02d-%02d\t%s\n",
           data[3], data[2], data[1], $0
}' pagamentos.txt |
    sort -k1,1 |
    cut -f2-

O awk transforma:

 31/12/2025 

em uma chave auxiliar:

 2025-12-31 

O registro completo transmitido ao sort fica parecido com:

 2025-12-31	Ana;31/12/2025;1200 

Depois da ordenação, o comando:

$ cut -f2- 

remove a chave temporária e conserva somente o registro original.

Essa técnica possui uma estrutura muito útil:

 criar a chave | ordenar | remover a chave 

Ela pode ser aplicada sempre que os dados originais não estiverem em um formato apropriado para comparação.

Por que endereços IP exigem tratamento especial

Endereços IPv4 possuem quatro números separados por pontos:

192.168.1.100
192.168.1.20
10.0.0.8
10.0.0.15

Uma ordenação textual simples:

$ sort ips.txt 

pode produzir:

10.0.0.15
10.0.0.8
192.168.1.100
192.168.1.20

Textualmente, 15 aparece antes de 8 porque a comparação começa pelos caracteres 1 e 8. O sort precisa comparar cada parte do endereço numericamente.

Tratando cada octeto como uma chave

Podemos usar o ponto como separador e transformar cada octeto em uma chave numérica:

$ sort -t. \
    -k1,1n \
    -k2,2n \
    -k3,3n \
    -k4,4n \
    ips.txt

Resultado:

10.0.0.8
10.0.0.15
192.168.1.20
192.168.1.100

Nesse comando:

  • -t. define o ponto como separador;
  • -k1,1n compara numericamente o primeiro octeto;
  • -k2,2n compara o segundo;
  • -k3,3n compara o terceiro;
  • -k4,4n compara o quarto.

A comparação avança para a chave seguinte somente quando os valores da chave anterior são iguais.

Esse método é adequado quando cada linha contém apenas um endereço IPv4.

Endereços IP dentro de registros

O tratamento fica mais delicado quando o endereço aparece no início de uma linha que contém outras informações:

192.168.1.20 acesso-permitido
10.0.0.8 acesso-negado
192.168.1.100 acesso-negado
10.0.0.15 acesso-permitido

Se usarmos o ponto como separador, o quarto campo também incluirá tudo o que aparece depois do IP:

 20 acesso-permitido 

Em situações simples, a comparação numérica poderá funcionar, mas a chave não estará delimitada de forma clara. Uma solução mais robusta é criar uma chave auxiliar com octetos de tamanho fixo:

$ awk '
{
    split($1, ip, ".")

    printf "%03d.%03d.%03d.%03d\t%s\n",
           ip[1], ip[2], ip[3], ip[4], $0
}' acessos.txt |
    sort -k1,1 |
    cut -f2-

O endereço:

 10.0.0.8 

é convertido temporariamente em:

 010.000.000.008 

Como todos os octetos passam a ter três algarismos, a ordem textual corresponde à ordem numérica.

Resultado:

10.0.0.8 acesso-negado
10.0.0.15 acesso-permitido
192.168.1.20 acesso-permitido
192.168.1.100 acesso-negado

A chave auxiliar é removida depois da ordenação, e o conteúdo original permanece inalterado.

Limitações importantes

Os exemplos apresentados pressupõem que os dados estejam bem-formados. O sort não valida datas nem endereços IP. Uma data como:

 35/18/2025 

poderá ser ordenada, apesar de ser inválida.

O mesmo acontece com um endereço como:

 999.300.1.8 

Se houver possibilidade de dados incorretos, a validação deverá ser feita antes da ordenação.

A solução com quatro chaves numéricas também se aplica especificamente ao IPv4. Endereços IPv6 possuem uma estrutura mais complexa, podem usar letras hexadecimais e permitem diferentes formas equivalentes de abreviação. Para ordenar IPv6 corretamente, é recomendável normalizar os endereços com uma ferramenta que compreenda esse formato e só então realizar a ordenação.

Conclusão

Datas e endereços IPv4 podem ser ordenados com o sort, desde que seus componentes sejam comparados na ordem correta.

Datas no formato ISO podem ser ordenadas diretamente:

$ sort -k1,1 eventos.txt 

Datas brasileiras exigem chaves para ano, mês e dia:

$ sort -t';' \
    -k2.7,2.10n \
    -k2.4,2.5n \
    -k2.1,2.2n \
    pagamentos.txt

Endereços IPv4 podem ser divididos em quatro chaves numéricas:

$ sort -t. \
    -k1,1n \
    -k2,2n \
    -k3,3n \
    -k4,4n \
    ips.txt

Quando a estrutura dos registros dificulta a definição das chaves, podemos usar awk para criar uma representação auxiliar, ordenar por ela e removê-la em seguida. Esse padrão amplia bastante as possibilidades do sort e permite organizar dados que, à primeira vista, não poderiam ser comparados corretamente como simples linhas de texto.



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