我需要根據其中變數“cpu”的內容對執行緒轉儲進行排序。例子:
"GC Thread#7" os_prio=0 cpu=143.66ms elapsed=57.42s tid=0x0000000003c8b800 nid=0x1bf1 runnable
"G1 Refine#6" os_prio=0 cpu=0.15ms elapsed=29.03s tid=0x0000000006efb000 nid=0x1cda runnable
"G1 Refine#5" os_prio=0 cpu=0.27ms elapsed=29.03s tid=0x0000000005b5b800 nid=0x1cd9 runnable
"G1 Refine#0" os_prio=0 cpu=10.31ms elapsed=59.04s tid=0x0000000000f1c800 nid=0x1bd1 runnable
"GC Thread#4" os_prio=0 cpu=143.24ms elapsed=57.42s tid=0x0000000003c88800 nid=0x1bee runnable
"GC Thread#3" os_prio=0 cpu=146.71ms elapsed=57.42s tid=0x0000000004003800 nid=0x1bed runnable
我需要按cpu對串列進行排序。通過將串列存盤在檔案中,我發現以下命令運行良好:
sort -k 3 cpu.txt
直到我發現它不適用于名稱中有多個空格的執行緒:
"Weld Thread Pool -- 2" #145 prio=5 os_prio=0 cpu=8.66ms elapsed=49.56s tid=0x00000000088e2800 nid=0x1cb8 waiting on condition [0x00007ffa47d20000]
似乎我不能使用“sort -k”提供的排序標準,因為它將空格計為列。知道什么是另一種選擇嗎?謝謝!
uj5u.com熱心網友回復:
使用 GNU awk:
$ gawk '{ # GNU awk
for(i=1;i<=NF;i ) # loop all fields
if($i~/^cpu=/) { # when cpu= found
split($i,cpu,/=/) # split @ = to get the time
break # no need to search further
}
a[cpu[2]]=a[cpu[2]] $0 ORS # append to time indexed array *
}
END { # in the end
PROCINFO["sorted_in"]="@ind_num_asc" # sort on the index
for(i in a) # loop all indexes
printf "%s", a[i] # output
}' file
輸出:
"G1 Refine#6" os_prio=0 cpu=0.15ms elapsed=29.03s tid=0x0000000006efb000 nid=0x1cda runnable
"G1 Refine#5" os_prio=0 cpu=0.27ms elapsed=29.03s tid=0x0000000005b5b800 nid=0x1cd9 runnable
"Weld Thread Pool -- 2" #145 prio=5 os_prio=0 cpu=8.66ms elapsed=49.56s tid=0x00000000088e2800 nid=0x1cb8 waiting on condition [0x00007ffa47d20000]
"G1 Refine#0" os_prio=0 cpu=10.31ms elapsed=59.04s tid=0x0000000000f1c800 nid=0x1bd1 runnable
...
* 如果有幾個相同的 cpu 時間,則記錄將附加到未排序的同一陣列單元格中,因為不需要澄清這一點。由于我們使用的是 GNU awk,因此可以使用二維或更多維陣列并使用相同的邏輯 ( a[cpu[2]][etc[2]]...for(i in a)for(j in a[i]))進一步排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369693.html
