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?

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

¿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"

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.