Форматировать вывод команды «ps» без пробелов

11

У меня есть следующая psкоманда, чтобы получить конкретные свойства всех запущенных процессов вместе с некоторыми свойствами:

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

Я хотел бы отформатировать его в CSV, чтобы я мог разобрать его. Обратите внимание, что я поставил аргументы в конце, чтобы облегчить анализ; Я не думаю, что ,будет существовать в других колонках - поправьте меня, если я ошибаюсь.

Как мне удалить пробел?

гепард
источник

Ответы:

10

Со страницы руководства:

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

Поэтому постарайтесь:

/bin/ps -o uname:1,ppid:1,pid:1
Фелипе Альварес
источник
Вы не могли бы выбрать это в качестве принятого ответа? @ Jeff-Schaller
Фелипе Альварес
5

Поскольку первые 6 полей не должны содержать пустых символов (если вы не разрешите их в именах пользователей), вы можете постобработать вывод:

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

Здесь цитируем последнее поле (args) после экранирования "s и \s с помощью \.

Производит вывод как:

stephane,3641,3702,10-00:20:24,0.1,0.3,"some cmd,and,args... VAR=foo\"bar"
Стефан Шазелас
источник
2

Вы можете использовать sedс ps. Так что вы хотите здесь: -

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

Но мне интересно, будет ли это полезно, так как выход psсам по себе имеет много ,.

beginer
источник
Как я уже упоминал, я полагаю, что я выбрал только один столбец, который мог бы иметь тот, ,который я поставил в конце, однако это решение удалит ,из этого столбца, который я не хочу.
Гепард
Посмотрите на вывод, который генерируется, и скажите мне, если вы считаете, что это желательно :) Особенно обратите внимание на столбец команды.
Оли
Это было бы так же, как tr ' ' ,. Вы, вероятно, хотите tr -s ' ' ,здесь.
Стефан Шазелас