Formatieren Sie die Ausgabe des Befehls 'ps' ohne Leerzeichen

11

Ich habe den folgenden psBefehl, um bestimmte Eigenschaften aller laufenden Prozesse zusammen mit einigen Eigenschaften abzurufen:

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

Ich möchte, dass es in CSV formatiert wird, damit ich es analysieren kann. Hinweis: Ich habe die Argumente am Ende gesetzt, um das Parsen zu vereinfachen. Ich glaube nicht, dass ,in einer der anderen Spalten ein Wille existiert - bitte korrigieren Sie mich, wenn ich falsch liege.

Wie entferne ich das Leerzeichen?

Gepard
quelle

Antworten:

10

Von der Manpage:

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

Also versuche:

/bin/ps -o uname:1,ppid:1,pid:1
Felipe Alvarez
quelle
Würde es Ihnen etwas ausmachen, dies als akzeptierte Antwort auszuwählen? @ Jeff-schaller
Felipe Alvarez
5

Da die ersten 6 Felder keine Leerzeichen enthalten sollten (es sei denn, Sie erlauben sie in Benutzernamen), können Sie die Ausgabe nachbearbeiten:

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

Hier wird das letzte Feld (args) zitiert, nachdem das "s und \s mit entkommen ist \.

Erzeugt eine Ausgabe wie:

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

Sie können sedmit verwenden ps. Also, was Sie wollen, ist hier: -

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

Aber ich frage mich, ob es nützlich wäre, da die Ausgabe von sich psselbst viel hat ,.

Anfänger
quelle
Wie ich bereits erwähnt habe, glaube ich, dass ich nur eine Spalte ausgewählt habe, die eine ,haben könnte, die ich am Ende eingefügt habe. Diese Lösung würde jedoch die ,Spalte entfernen , die ich nicht möchte.
Cheetah
Schauen Sie sich die Ausgabe an, die generiert wird, und sagen Sie mir, ob Sie dies für wünschenswert halten :) Beachten Sie insbesondere die Befehlsspalte.
Oli
Das wäre das gleiche wie tr ' ' ,. Sie wollen wahrscheinlich tr -s ' ' ,hier.
Stéphane Chazelas