Estou trabalhando em um complicado grep
, algo como grep -E -i "first|next" *.txt
, e recebo resultados como:
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), before Unsubscribe() |
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), after Unsubscribe() |
Agora, gostaria de ordenar os resultados, com base no timestamp, que parece bem fácil:
Prompt> grep ... | sort -t: -k2
... mas há um problema: como você vê o "antes" e "depois" acontecem regularmente no mesmo décimo de milissegundo, e o sort
comando os alterna:
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), after Unsubscribe() |
logs.10.txt:2022-10-07 10:33:05.6673 | ClassName | [Info] | Inside function first(), before Unsubscribe() |
Já tentei adicionar um delimitador de campo extra ao sort
comando, mas isso não funciona:
Prompt> grep ... | sort -t:| -k2
É possível:
- adicionar um parâmetro de comprimento ao
sort
comando? (Ordenar apenas nos primeiros 24 caracteres) Ou: - adicionar um segundo delimitador de campo? (Como o personagem pipe)
Em
-k2
não há posição de parada. A posição de parada é padronizada para o final da linha.after
classifica antesbefore
, daí o problema.Se você deseja classificar apenas por carimbo de data/hora, uma das soluções possíveis para o seu caso específico é
-t: -k2,4.7
. Isso é por que:logs.10.txt
parece um nome arbitrário. Tenha em mente que alguns nomes podem quebrar nossa lógica. Por exemplo, selog:foo.txt
aparecer onde você esperalogs.10.txt
, os dois pontos nele seriam uma instância de separador que não prevíamos.Além disso, você deseja
-s
, classificação estável .Meus testes com o GNU
sort
8.30 sugerem que-t: -k2,2.24
funciona, apesar do 2º campo ter menos de 24 caracteres. Isso seria "somente classificar nos primeiros 24 caracteres" que você solicitou. Não encontrei (ainda) nenhuma documentação clara desse comportamento. Se eu fosse você, não usaria-k2,2.24
, apenas no caso.-k2,4.7
é válido com certeza.