예를 들어. 다양한 사용자가 실행하는 프로세스는 다음과 같습니다.
root 5
xuser 3
yuser 1
그러면 스크립트의 출력은 다음과 같아야 합니다.
root .....
xuser ...
yuser .
답변1
printf
Bash를 사용 하여 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 이하인 사용자 이름을 허용하도록 행 형식을 지정하도록 첫 번째 변형에서 변경되었습니다 .