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: 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.