열 값을 기준으로 행 정렬

열 값을 기준으로 행 정렬

다음과 같은 스레드 덤프를 정렬해야 합니다.

$ 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

자체적으로 직접 검색할 수 없는 입력의 하위 집합에서 전체 줄을 정렬하는 동안 채택할 수 있는 디자인 "패턴"이 있습니다. 이러한 경우 아래와 같은 다단계 파이프라인에서 이 작업을 수행하는 것이 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

답변2

필드 구분 기호로 사용하는 경우 =CPU 값은 4번째 필드에 있습니다. 넌 할 수있어

jstack -l 5213 | grep cpu | sort -t '=' -g -k4,4

-g"일반 숫자" 정렬용 입니다 .

주어진 데이터를 사용하여 출력은 다음과 같습니다.

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.31ms elapsed=478.03s tid=0x00000000013db000 nid=0x1467 runnable  [0x0000000000000000]
"Finalizer" #3 daemon prio=8 os_prio=0 cpu=1.30ms elapsed=478.03s tid=0x00000000013c6000 nid=0x1466 in Object.wait()  [0x00007f386cb0b000]
"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=2.21ms elapsed=478.03s tid=0x00000000013bb800 nid=0x1465 waiting on condition  [0x00007f386cc0c000]
"C1 CompilerThread0" #8 daemon prio=9 os_prio=0 cpu=1840.51ms elapsed=478.02s tid=0x00000000013e0000 nid=0x1469 waiting on condition  [0x0000000000000000]
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=3042.89ms elapsed=478.02s tid=0x00000000013dd800 nid=0x1468 waiting on condition  [0x0000000000000000]

이는 인용 문자열에 등호가 나타나지 않는다고 가정하므로 @Inian의 답변만큼 안정적이지 않습니다.

관련 정보