我必须对一个看起来像这样的线程转储进行排序:
$ 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]
转储非常大,所以我想按“cpu”列(升序或降序)对其进行排序。似乎排序命令接受“k”参数来指示用作排序标准的列。“cpu”是第 5 列,所以我尝试过:
$ 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]
我看到订单发生了变化,但它不符合我期望的标准(“cpu”)。知道“cpu=value”之类的文本是否可以用作排序标准,还是需要与其他命令结合使用?谢谢
可以采用一种设计“模式”,同时在输入子集上对整行进行排序,而输入子集本身不能直接检索。在这种情况下,像下面这样在多阶段管道中执行此操作比在 Awk 或 perl 中编写完整的命令要好
您可以做的一种方法是使用 Awk 提取
ms
子字符串,转换为数字并打印整行和毫秒值,然后根据后者进行排序,然后将其修剪掉。将您的命令输出通过管道传输到以下内容
对于时间的降序,将
-r
标志添加到sort
如果
=
用作字段分隔符,则 cpu 值在第 4 个字段中。你可以做用于
-g
“一般数字”排序。给定数据,输出为
这假设等号没有出现在引用的字符串中,所以它不像@Inian 的答案那么稳定。