Shell Script para buscar processos linux e mostrar a contagem de processos para usuários individuais como “.” [closed]

0

Os processos que estão sendo executados por vários usuários são os seguintes.

root 5
xuser 3
yuser 1

Em seguida, o script deve fornecer a saída como:

root .....
xuser ...
yuser .
    
por Prashant Shetage 04.06.2018 / 15:26

2 respostas

1

Você pode usar o bash printf e o tr para fazer este histograma:

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   .
    
por 04.06.2018 / 16:37
0

Usando o Perl e supondo que os dados estejam localizados em file :

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

Você também pode aplicar isso em um fluxo de dados:

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

O script Perl corresponde à string inicial e ao número na entrada, e a saída da string e o número apropriado de pontos, com um caractere de tabulação entre eles.

Com um pouco de ajustes acima (para poder ler uniq -c output, que tem o número primeiro ), o seguinte obteria o número de processos em execução para cada usuário e exibição as contagens como pontos:

$ 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      ..........................

O comando ps pode precisar de modificação para produzir a coisa correta no Linux (estou usando o OpenBSD aqui, mas parece fazer a coisa certa no Ubuntu também). O script Perl foi alterado da primeira variação para que leia corretamente uniq -c output e formata as linhas para permitir nomes de usuário com comprimento igual ou inferior a 10.

    
por 04.06.2018 / 15:51