Format de la sortie de la commande 'ps' sans espace

11

J'ai la pscommande suivante pour obtenir des propriétés particulières de tous les processus en cours d'exécution ainsi que certaines propriétés:

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

Je souhaite l'avoir formaté en CSV pour pouvoir l'analyser. Remarque J'ai mis les arguments à la fin pour faciliter l'analyse; Je ne pense pas qu'il y en ,aura dans les autres colonnes - veuillez me corriger si je me trompe.

Comment supprimer l'espace blanc?

guépard
la source

Réponses:

10

Depuis la page de manuel:

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

Essayez donc:

/bin/ps -o uname:1,ppid:1,pid:1
Felipe Alvarez
la source
Pourriez-vous sélectionner cette réponse comme réponse acceptée? @ jeff-schaller
Felipe Alvarez
5

Étant donné que les 6 premiers champs ne doivent pas contenir de caractères vides (sauf si vous les autorisez dans les noms d'utilisateur), vous pouvez post-traiter la sortie:

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

Ici en citant le dernier champ (args) après avoir échappé aux "s et \s avec \.

Produit une sortie comme:

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

Vous pouvez utiliser sedavec ps. Donc, ce que vous voulez, c'est ici: -

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

Mais je me demande si ce serait utile, car la sortie en pselle - même en a beaucoup ,.

débutant
la source
Comme je l'ai mentionné, je crois que je n'ai choisi qu'une seule colonne qui pourrait avoir une ,que j'ai mise à la fin, cependant, cette solution supprimerait la ,de cette colonne dont je ne veux pas.
Cheetah
Regardez la sortie qui génère et dites-moi si vous pensez que c'est souhaitable :) Surtout, notez la colonne de commande.
Oli
Ce serait la même chose que tr ' ' ,. Vous voulez probablement tr -s ' ' ,ici.
Stéphane Chazelas