列値に基づいて行を並べ替える

列値に基づいて行を並べ替える

スレッドダンプを次のようにソートする必要があります。

$ 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」列に基づいてソート(昇順または降順)したいと思います。 sortコマンドは、ソート基準として使用される列を示すために「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」などのテキストをソート基準として使用できるのか、それとも別のコマンドと組み合わせる必要があるのか​​をご存知ですか?ありがとう

ベストアンサー1

独自に直接取得できない入力サブセットで行全体を並べ替えるときに、1つのデザイン「パターン」を採用できます。この場合、AwkまたはPerlで完全なコマンドを作成するよりも、以下のようなマルチレベルパイプラインで実行する方がよいでしょう。

これを行う1つの方法は、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

おすすめ記事