Định dạng đầu ra lệnh 'ps' không có khoảng trắng


11

Tôi có pslệnh sau để có được các thuộc tính cụ thể của tất cả các quy trình đang chạy cùng với một số thuộc tính:

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

Tôi muốn nó được định dạng trong CSV để tôi có thể phân tích cú pháp. Lưu ý tôi đã đặt các đối số ở cuối để làm cho phân tích cú pháp dễ dàng; Tôi không nghĩ ,sẽ tồn tại trong bất kỳ cột nào khác - vui lòng sửa cho tôi nếu tôi sai.

Làm cách nào để xóa khoảng trắng?

Câu trả lời:


10

Từ trang người đàn ông:

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

Hãy thử

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

Bạn có phiền khi chọn câu này làm Câu trả lời được chấp nhận không? @ jeff-schaller
Felipe Alvarez

5

Vì 6 trường đầu tiên không được chứa các ký tự trống (trừ khi bạn cho phép chúng trong tên người dùng), bạn có thể xử lý hậu kỳ đầu ra:

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

Ở đây trích dẫn trường cuối cùng (args) sau khi thoát khỏi "s và \s với \.

Tạo ra một đầu ra như:

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

2

Bạn có thể sử dụng sedvới ps. Vì vậy, những gì bạn muốn là ở đây: -

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

Nhưng tôi tự hỏi nếu nó sẽ hữu ích, vì đầu ra của pschính nó đã có rất nhiều ,.


Như tôi đã đề cập, tôi tin rằng tôi chỉ chọn một cột có thể có một cột ,mà tôi đã đặt ở cuối, tuy nhiên, giải pháp này sẽ xóa ,cột đó khỏi cột mà tôi không muốn.
Cheetah

Nhìn vào đầu ra tạo ra và cho tôi biết nếu bạn nghĩ rằng đó là mong muốn :) Đặc biệt chú ý đến cột lệnh.
Oli

Điều đó sẽ giống như tr ' ' ,. Bạn có thể muốn tr -s ' ' ,ở đây.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.