Formate a saída do comando 'ps' sem espaço em branco

11

Eu tenho o seguinte pscomando para obter propriedades específicas de todos os processos em execução, juntamente com algumas propriedades:

ps --no-headers -exo "uname,ppid,pid,etime,%cpu,%mem,args"

Desejo formatá-lo em CSV para que eu possa analisá-lo. Observe que coloquei os argumentos no final para facilitar a análise; Eu não acho que a ,existirá em nenhuma das outras colunas - por favor, corrija-me se estiver errado.

Como removo o espaço em branco?

guepardo
fonte

Respostas:

10

Na página do manual:

-o format       user-defined format.
                format is a single argument in the form of a blank-separated or comma-separated list, which offers a
                way to specify individual output columns. The recognized keywords are described in the STANDARD FORMAT
                SPECIFIERS section below. Headers may be renamed (ps -o pid,ruser=RealUser -o comm=Command) as
                desired. If all column headers are empty (ps -o pid= -o comm=) then the header line will not be
                output. Column width will increase as needed for wide headers; this may be used to widen up columns
                such as WCHAN (ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm). Explicit width control
                (ps opid,wchan:42,cmd) is offered too. The behavior of ps -o pid=X,comm=Y varies with personality;
                output may be one column named "X,comm=Y" or two columns named "X" and "Y". Use multiple -o options
                when in doubt. Use the PS_FORMAT environment variable to specify a default as desired; DefSysV and
                DefBSD are macros that may be used to choose the default UNIX or BSD columns.

Então tente:

/bin/ps -o uname:1,ppid:1,pid:1
Felipe Alvarez
fonte
Você se importaria de selecioná-la como Resposta Aceita? @ jeff-schaller
Felipe Alvarez
5

Como os 6 primeiros campos não devem conter caracteres em branco (a menos que você os permita nos nomes de usuário), é possível pós-processar a saída:

ps --no-headers -exo "uname,ppid,pid,etime,%cpu,%mem,args" | sed '
  s/[\"]/\\&/g
  s/  */,/;s/  */,/;s/  */,/;s/  */,/;s/  */,/;s/  */,"/
  s/$/"/'

Aqui citando o último campo (args) depois de terem escapado das "s e \s com \.

Produz uma saída como:

stephane,3641,3702,10-00:20:24,0.1,0.3,"some cmd,and,args... VAR=foo\"bar"
Stéphane Chazelas
fonte
2

Você pode usar sedcom ps. Então, o que você quer está aqui: -

ps --no-headers -exo "uname,ppid,pid,etime,%cpu,%mem,args" | sed 's/\ /,/g'

Mas eu me pergunto se isso seria útil, pois a produção em pssi tem muitas ,.

iniciante
fonte
Como mencionei, acredito que tenha escolhido apenas uma coluna que poderia ter uma ,que eu coloquei no final; no entanto, essa solução removeria a ,coluna daquela que eu não quero.
Cheetah
Veja a saída que gera e me diga se você acha isso desejável :) Especialmente observe a coluna de comando.
Oli #
Isso seria o mesmo que tr ' ' ,. Você provavelmente quer tr -s ' ' ,aqui.
Stéphane Chazelas