Sformatuj dane wyjściowe polecenia „ps” bez białych znaków

11

Mam następującą pskomendę, aby uzyskać określone właściwości wszystkich uruchomionych procesów wraz z niektórymi właściwościami:

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

Chcę mieć sformatowany plik w formacie CSV, aby móc go przeanalizować. Uwaga: umieściłem argumenty na końcu, aby ułatwić parsowanie; Nie sądzę, ,aby istniał w żadnej innej kolumnie - popraw mnie, jeśli się mylę.

Jak usunąć białe znaki?

Gepard
źródło

Odpowiedzi:

10

Ze strony podręcznika:

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

Więc spróbuj:

/bin/ps -o uname:1,ppid:1,pid:1
Felipe Alvarez
źródło
Czy mógłbyś wybrać tę odpowiedź jako zaakceptowaną? @ jeff-schaller
Felipe Alvarez
5

Ponieważ pierwsze 6 pól nie powinno zawierać pustych znaków (chyba że zezwalasz na nazwy użytkowników), możesz przetworzyć dane wyjściowe:

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

Tu przytoczyć ostatnie pole (args) po uszedłszy "s i \s z \.

Tworzy dane wyjściowe takie jak:

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

Możesz używać sedz ps. Więc chcesz tutaj: -

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

Ale zastanawiam się, czy byłoby to użyteczne, ponieważ pssamo wyjście ma wiele ,.

początkujący
źródło
Jak wspomniałem, wydaje mi się, że wybrałem tylko jedną kolumnę, która może mieć kolumnę, ,którą umieściłem na końcu, jednak to rozwiązanie usunęłoby ,tę kolumnę, której nie chcę.
Gepard
Spójrz na generowane dane wyjściowe i powiedz mi, jeśli uważasz, że jest to pożądane :) Zwróć szczególnie uwagę na kolumnę poleceń.
Oli
To byłoby to samo co tr ' ' ,. Prawdopodobnie chcesz tr -s ' ' ,tutaj.
Stéphane Chazelas