Memformat output perintah 'ps' tanpa spasi


11

Saya memiliki psperintah berikut untuk mendapatkan properti tertentu dari semua proses yang berjalan bersama dengan beberapa properti:

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

Saya ingin memformatnya dalam CSV sehingga saya dapat menguraikannya. Catatan Saya telah menempatkan args di bagian akhir untuk memudahkan penguraian; Saya tidak berpikir ,ada wasiat di salah satu kolom lainnya - mohon perbaiki jika saya salah.

Bagaimana cara menghapus spasi putih?

Jawaban:


10

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

Jadi cobalah:

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

Maukah Anda memilih ini sebagai Jawaban yang Diterima? @ jeff-schaller
Felipe Alvarez

5

Karena 6 bidang pertama tidak boleh berisi karakter kosong (kecuali jika Anda mengizinkannya dalam nama pengguna), Anda dapat memposting-proses output:

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

Di sini mengutip kolom terakhir (argumen) setelah lolos dari "dan \bersama \.

Menghasilkan keluaran seperti:

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

2

Anda bisa menggunakannya sedbersama ps. Jadi yang Anda inginkan ada di sini: -

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

Tetapi saya bertanya-tanya apakah itu akan berguna, karena hasil dari psitu sendiri telah mendapat banyak ,.


Seperti yang saya sebutkan, saya percaya saya hanya memilih satu kolom yang dapat memiliki ,yang saya letakkan di akhir, namun, solusi ini akan menghapus ,dari kolom yang tidak saya inginkan.
Cheetah

Lihatlah output yang menghasilkan dan beri tahu saya jika Anda pikir itu diinginkan :) Terutama perhatikan kolom perintah.
Oli

Itu akan sama dengan tr ' ' ,. Anda mungkin mau di tr -s ' ' ,sini.
Stéphane Chazelas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.