Shell-Script

根據列的值對行進行排序

  • October 25, 2021

我必須對一個看起來像這樣的執行緒轉儲進行排序:

$ 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

引用自:https://unix.stackexchange.com/questions/674735