Eu tenho que ordenar um dump de thread que se parece com isso:
$ jstack -l 5213 | grep cpu
"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=2.21ms elapsed=478.03s tid=0x00000000013bb800 nid=0x1465 waiting on condition [0x00007f386cc0c000]
"Finalizer" #3 daemon prio=8 os_prio=0 cpu=1.30ms elapsed=478.03s tid=0x00000000013c6000 nid=0x1466 in Object.wait() [0x00007f386cb0b000]
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.31ms elapsed=478.03s tid=0x00000000013db000 nid=0x1467 runnable [0x0000000000000000]
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=3042.89ms elapsed=478.02s tid=0x00000000013dd800 nid=0x1468 waiting on condition [0x0000000000000000]
"C1 CompilerThread0" #8 daemon prio=9 os_prio=0 cpu=1840.51ms elapsed=478.02s tid=0x00000000013e0000 nid=0x1469 waiting on condition [0x0000000000000000]
O dump é bem grande, então gostaria de classificá-lo pela coluna "cpu" (crescente ou decrescente). Parece que o comando sort aceita o parâmetro "k" para indicar a coluna a ser usada como critério de classificação. "cpu" é a 5ª coluna, então eu tentei com:
$ jstack -l 5213 | grep cpu | sort -k 5
"ServerService Thread Pool -- 1" #26 prio=5 os_prio=0 cpu=10.86ms elapsed=753.24s tid=0x0000000002b68800 nid=0x1482 waiting on condition [0x00007f385c33b000]
"Transaction Expired Entry Monitor" #131 daemon prio=5 os_prio=0 cpu=0.48ms elapsed=751.66s tid=0x00000000082ed000 nid=0x14eb in Object.wait() [0x00007f3853826000]
"Transaction Reaper Worker 0" #133 daemon prio=5 os_prio=0 cpu=0.13ms elapsed=751.63s tid=0x00000000084d9000 nid=0x14ee in Object.wait() [0x00007f3853523000]
Vejo que a ordem foi alterada, mas não segue os critérios que eu esperava ("cpu"). Alguma ideia se um texto como "cpu=value" pode ser usado como critério para classificar ou precisa ser combinado com outros comandos? Obrigado
Existe um "padrão" de design que pode ser adotado, enquanto ordena linhas inteiras em um subconjunto de entrada, que por si só não pode ser recuperado diretamente. Nesses casos, fazer isso em um pipeline de vários estágios como abaixo seria melhor do que escrever um comando completo em Awk ou perl
Uma maneira que você pode fazer é usar o Awk para extrair a
ms
substring, converter em um numérico e imprimir a linha inteira e o valor de milissegundos e classificar com base no último e cortá-lo depois.Encaminhe sua saída de comando para o seguinte
Para ordem decrescente de vezes, adicione o
-r
sinalizador asort
Se você usar
=
como separador de campo, o valor da cpu fica no 4º campo. Você pode fazercom
-g
para classificação "numérica geral".Com os dados fornecidos, a saída é
Isso pressupõe que o sinal de igual não apareça na string citada, portanto, não é tão estável quanto a resposta de @Inian.