Shell-Script
根據列的值對行進行排序
我必須對一個看起來像這樣的執行緒轉儲進行排序:
$ 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
子字元串,轉換為數字並列印整行和毫秒值,然後根據後者進行排序,然後將其修剪掉。將您的命令輸出通過管道傳輸到以下內容
awk 'match($0, /cpu=[[:digit:].]+/){print substr($0, RSTART+4, RLENGTH-1)+0, $0}' | sort -n -k1,1 | cut -d' ' -f2-
對於時間的降序,將
-r
標誌添加到sort