Formatta l'output del comando 'ps' senza spazi bianchi


11

Ho il seguente pscomando per ottenere proprietà particolari di tutti i processi in esecuzione insieme ad alcune proprietà:

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

Vorrei averlo formattato in CSV in modo da poterlo analizzare. Nota che ho messo gli arg alla fine per facilitare l'analisi; Non credo ,che esista una volontà in nessuna delle altre colonne, per favore correggimi se sbaglio.

Come rimuovo gli spazi bianchi?

Risposte:


10

Dalla pagina man:

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

Allora prova:

/bin/ps -o uname:1,ppid:1,pid:1

Ti dispiacerebbe selezionare questo come risposta accettata? @ Jeff-Schaller
Felipe Alvarez,

5

Poiché i primi 6 campi non devono contenere caratteri vuoti (a meno che tu non li consenta nei nomi utente), puoi postelaborare l'output:

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

Qui citando l'ultimo campo (args) dopo essere sfuggito alla "s e alla \s \.

Produce un output come:

stephane,3641,3702,10-00:20:24,0.1,0.3,"some cmd,and,args... VAR=foo\"bar"

2

Puoi usarlo sedcon ps. Quindi quello che vuoi è qui: -

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

Ma mi chiedo se sarebbe utile, dato che l'output di psse stesso ne ha molti ,.


Come ho già detto, credo di aver scelto solo una colonna che potrebbe avere una ,che ho messo alla fine, tuttavia, questa soluzione rimuoverà ,da quella colonna che non desidero.
Ghepardo,

Guarda l'output che genera e dimmi se pensi che sia desiderabile :) In particolare, fai attenzione alla colonna dei comandi.
Oli,

Sarebbe lo stesso di tr ' ' ,. Probabilmente vuoi tr -s ' ' ,qui.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.