Linux 프로세스를 가져오고 개별 사용자의 프로세스 수를 "."으로 표시하는 쉘 스크립트

Linux 프로세스를 가져오고 개별 사용자의 프로세스 수를 "."으로 표시하는 쉘 스크립트

예를 들어. 다양한 사용자가 실행하는 프로세스는 다음과 같습니다.

root 5
xuser 3
yuser 1

그러면 스크립트의 출력은 다음과 같아야 합니다.

root .....
xuser ...
yuser .

답변1

printfBash를 사용 하여 tr이 히스토그램을 그릴 수 있습니다 .

while read name num; do 
    dots=$(printf "%*s" $num " " | tr " " .)
    printf "%s\t%s\n" "$name" "$dots"
done <<END
root 5
xuser 3
yuser 1
END
root    .....
xuser   ...
yuser   .

답변2

Perl을 사용하고 데이터가 다음 위치에 있다고 가정합니다 file.

$ perl -ne '/^(\w+)\s+(\d+)$/ && printf("%s\t%s\n", $1, "." x $2)' file
root    .....
xuser   ...
yuser   .

데이터 흐름에도 적용할 수 있습니다.

somecommand | perl -ne '...as above...'

Perl 스크립트는 입력의 초기 문자열과 숫자를 일치시킨 다음 그 사이에 탭 문자를 사용하여 문자열과 적절한 수의 점을 출력합니다.


uniq -c위의 내용을 일부 조정합니다( 숫자가 포함된 출력을 읽을 수 있도록).첫 번째), 다음 코드는 사용자당 실행 중인 프로세스 수를 가져와서 그 수를 점으로 표시합니다.

$ ps -ax -o user= | sort | uniq -c | perl -ne '/^\s*(\d+)\s+(\w+)$/ && printf("%-10s%s\n", $2, "." x $1)'
_dbus     .
_dhcp     .
_ntp      ..
_pflogd   .
_slaacd   ..
_smtpd    .....
_smtpq    .
_syslogd  .
_unbound  .
kk        ................
root      ..........................

ps명령가능한Linux에서 올바른 콘텐츠를 출력하려면 수정이 필요합니다(여기에서는 OpenBSD를 사용하고 있지만 Ubuntu에서도 올바른 작업을 수행하는 것 같습니다). Perl 스크립트는 uniq -c출력을 올바르게 읽고 길이가 10 이하인 사용자 이름을 허용하도록 행 형식을 지정하도록 첫 번째 변형에서 변경되었습니다 .

관련 정보