Formatee la salida del comando 'ps' sin espacios en blanco

11

Tengo el siguiente pscomando para obtener propiedades particulares de todos los procesos en ejecución junto con algunas propiedades:

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

Deseo tenerlo formateado en CSV para poder analizarlo. Tenga en cuenta que he puesto los argumentos al final para facilitar el análisis; No creo ,que exista un testamento en ninguna de las otras columnas; corríjame si me equivoco.

¿Cómo elimino el espacio en blanco?

leopardo
fuente

Respuestas:

10

Desde la página del 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.

Entonces intenta:

/bin/ps -o uname:1,ppid:1,pid:1
Felipe Alvarez
fuente
¿Te importaría seleccionar esto como la respuesta aceptada? @ jeff-schaller
Felipe Alvarez
5

Como los primeros 6 campos no deben contener caracteres en blanco (a menos que los permita en los nombres de usuario), puede procesar la salida posteriormente:

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

Aquí citando el último campo (args) después de haber escapado de las "s y \s con \.

Produce una salida como:

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

Puedes usar sedcon ps. Entonces, lo que quieres está aquí: -

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

Pero me pregunto si sería útil, ya que la producción en pssí misma tiene mucho ,.

principiante
fuente
Como mencioné, creo que solo he elegido una columna que podría tener una ,que puse al final, sin embargo, esta solución eliminaría la ,de esa columna que no quiero.
Cheetah
Mira la salida que genera y dime si crees que es deseable :) Especialmente toma nota de la columna de comandos.
Oli
Eso sería lo mismo que tr ' ' ,. Probablemente quieras tr -s ' ' ,aquí.
Stéphane Chazelas