답변1
ps
AFAIK 옵션이 포함된 순수한 명령을 통해서는 간단히 수행 할 수 없습니다 . 그러나 예를 들어 일부 텍스트 프로세서를 사용하여 awk
원하는 작업을 수행하도록 할 수 있습니다.
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
이는 에서 결과를 가져온 ps
다음 첫 번째 행을 제외한 각 행에 대해 일반적으로 KB 단위인 다섯 번째 열을 대체한 다음 MB에 M 접미사를 추가합니다.
별칭으로 만들어서 저장할 수 있습니다..bashrc.myps
대부분의 사람들은 형식을 보존하는 방법이나 다른 단위와 정밀도를 사용하는 방법을 묻습니다.
column -t
간단한 버전의 경우 출력 필터를 사용할 수 있습니다 .
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t
그러나 이는 마지막 열의 공백을 올바르게 인식하지 못합니다. 불행하게도 우리는 텍스트 형식을 처리하고 printf
유사한 형식으로 자체 형식 문자열을 준비해야 합니다.
ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'
설명하다:
NR==1
조건은 첫 번째 행(제목)에만 적용됩니다. COMMAND가 시작되는 위치를 결정하기 위해 원시 ps 출력을 사용합니다.o=$0
나중에 사용할 수 있도록 수정되지 않은 전체 줄을 저장합니다.a=match($0,$11)
11번째 필드의 위치를 찾습니다(이는 원래 출력에서 COMMAND 열의 시작이어야 함).
NR>1
다음 행(데이터)에 대해. 다섯 번째 필드를 변경합니다.$5=int(10*$5/1024)/10"M"
값을 소수점 이하 한 자리의 메가바이트로 변경하고 "M" 접미사를 추가합니다.- printf는 모든 필드를 열과 같은 방식으로 표시합니다.
%-10s
왼쪽 정렬된 10자 너비의s
문자열을 나타냅니다 .10
-
%8s
s
8자 너비의 문자열을 나타내며 출력이8
없으므로-
필드가 오른쪽 정렬됩니다.
substr(o, a)
o
이전 조건이 평가된 위치에서 시작하여 원래 줄(따라서 이전에 저장됨)의 하위 문자열을 가져오므a
로 공백을 유지하면서 명령 출력을 표시할 수 있습니다.
답변2
나는 같은 문제에 대한 해결책을 찾기 위해 여기에 왔습니다. 놀랍게도 아직 더 나은 대답은 없습니다. 나는 이 스레드와 온라인에서 읽은 다른 페이지를 기반으로 약간 유연한 수정 사항을 만들었습니다.
내용을 더 읽기 쉽게 만들기 위해 자동 범위 기능을 만들어 및 필드에 사용 vsz
했습니다 rss
.
또한,예 실제로 방법임의의 필드 구분 기호를 강제로 사용합니다 ps
. 이것이 내가 하는 방법이다:
맨페이지 자막에 있는 필드 설명자를 사용할 AIX FORMAT DESCRIPTORS
때 문서화되지 않은 것으로 보이는 트릭을 발견했습니다 ps
. USER 또는 VSZ와 같은 작업을 수행하면 %
각 출력 줄 앞에 문자가 포함되는 것 같습니다 . 시도하면 어떻게 될지 궁금합니다. 한 줄에 하나씩 표시합니다. 좋습니다. 공백이 없는 임의의 문자열은 어떻습니까? 예! !%U
%z
%%
%
하지만분명히 당신은가지다%%
예상대로 작동하도록 만드세요 . %
이해하지 못하다. 유효한 필드 설명자인지 확인하기 위해 ps
뒤따르는 모든 항목을 구문 분석하려고 시도 합니다 . 따라서 문제를 피하기 위해 %
문자열 끝에 보관하는 것이 가장 안전할 것입니다 .FOOBARBIGSTRINGBLABLA%%
이제 유효한 데이터의 일부가 될 가능성이 상대적으로 낮은 문자열을 생각해내면 됩니다. 특히 이를 cmd
필드로 사용할 경우에는 더욱 그렇습니다. zzz:::zzz
그럴 것 같지 않습니다. %%
마지막에 추가 항목을 추가하여 작동하도록 합시다 . zzz:::zzz%%
이는 출력에 zzz:::zzz%
.
awk
다중 문자 필드 구분 기호를 처리할 수 있는 출력을 처리 중이며 awk
조회를 zzz:::zzz%
필드 구분 기호로 지정합니다.
|head -n20
마지막 단계는 |cut -c -250
출력을 20줄로 제한하고 250자 이후의 각 줄을 잘라내어 터미널을 깔끔하게 유지하는 것입니다. 실용적인 스크립팅 목적으로 이를 제거할 수도 있습니다.
편집하다:
이 예제를 사용하여 모든 필드를 기준으로 정렬할 수도 있음을 지적하기 위해 변수를 추가했습니다. 필드 이름은 ps
맨페이지 제목 아래에서 찾을 수 있습니다.STANDARD FORMAT SPECIFIERS
편집 2: 요청에 따라 임의의 필드 구분 기호가 작동하는 방식과 필드 구분 기호를 선택하는 이유에 대한 자세한 설명을 추가했습니다.
실시예 1
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep cmd --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
출력: (약간 정리된 예)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME CMD
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 /usr/bin/gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 /usr/libexec/Xorg vt1 -displayfd 3 -auth /run/user/42/gdm/Xauthority -background none -noreset -keeptty -verbose 3
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 /usr/libexec/gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 /usr/libexec/gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 /usr/libexec/gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 /usr/libexec/ibus-x11 --kill-daemon
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 /usr/libexec/gsd-clipboard
실시예 2
약간 더 간결한 버전:
sortbyfield="rss"; fsep="-o zzz:::zzz%% -o"; ps ax o user:16 $fsep pid $fsep pcpu $fsep pmem $fsep vsz $fsep rss $fsep tty $fsep stat $fsep lstart $fsep time:16 $fsep comm --sort -$sortbyfield | awk 'function setprefix(num){{n_suffix=1; while(num > 1000 && n_suffix < suffixes_len) {num /= 1024; n_suffix++;}; num=int(100*num)/100suffixes[n_suffix]}; return num} BEGIN{suffixes_len=split("kB MB GB TB PB EB ZB",suffixes);FS="zzz:::zzz%";} NR>1 {$5=setprefix($5);$6=setprefix($6); }{ printf "%-16s %6s %-5s %-5s %9s %9s %-8s %-8s %-25s %-18s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11;}' |head -n20 |cut -c -250
출력: (약간 정리된 예)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
gdm 1474 0.0 0.3 2.87GB 182.86MB tty1 Sl+ Sat Jun 18 01:31:44 2022 00:34:40 gnome-shell
gdm 1370 0.0 0.0 171.3MB 34.31MB tty1 Sl+ Sat Jun 18 01:31:43 2022 00:01:56 Xorg
gdm 1552 0.0 0.0 686.07MB 20.14MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:40 gsd-color
gdm 1577 0.0 0.0 870.49MB 19.53MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:01 gsd-media-keys
gdm 1538 0.0 0.0 531.81MB 18.51MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-xsettings
gdm 1541 0.0 0.0 539.53MB 18.5MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:04 gsd-power
gdm 1570 0.0 0.0 458.5MB 18.4MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-wacom
gdm 1500 0.0 0.0 386.57MB 17.94MB tty1 Sl Sat Jun 18 01:31:45 2022 00:00:00 ibus-x11
gdm 1537 0.0 0.0 386.13MB 17.92MB tty1 Sl+ Sat Jun 18 01:31:46 2022 00:00:00 gsd-clipboard
이것이 누군가에게 도움이 되기를 바랍니다!