จัดรูปแบบเอาต์พุตคำสั่ง 'ps' โดยไม่มีช่องว่าง


11

ฉันมีpsคำสั่งต่อไปนี้เพื่อรับคุณสมบัติเฉพาะของกระบวนการทำงานทั้งหมดพร้อมกับคุณสมบัติบางอย่าง:

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

ฉันต้องการจัดรูปแบบเป็น CSV เพื่อให้สามารถวิเคราะห์ได้ หมายเหตุฉันวางส่วนท้ายเพื่อให้การแยกวิเคราะห์ง่ายขึ้น ฉันไม่คิดว่า,จะมีอยู่ในคอลัมน์อื่น ๆ - โปรดแก้ไขฉันหากฉันผิด

ฉันจะลบช่องว่างออกได้อย่างไร

คำตอบ:


10

จากหน้าคน:

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

ดังนั้นลอง:

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

คุณจะเลือกสิ่งนี้เป็นคำตอบที่ยอมรับหรือไม่ @ jeff-schaller
Felipe Alvarez

5

เนื่องจากฟิลด์ 6 รายการแรกไม่ควรมีอักขระว่าง (เว้นแต่คุณอนุญาตในชื่อผู้ใช้) คุณสามารถประมวลผลเอาต์พุตได้:

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

นี่ quoting สนามสุดท้าย (args) หลังจากหนี"และ\S \กับ

สร้างผลลัพธ์เช่น:

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

2

คุณสามารถใช้กับsed psดังนั้นสิ่งที่คุณต้องการอยู่ที่นี่: -

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

แต่ผมสงสัยว่ามันจะเป็นประโยชน์ในขณะที่การส่งออกของตัวเองได้มีจำนวนมากps,


ดังที่ฉันได้กล่าวไปแล้วฉันเชื่อว่าฉันได้เลือกเพียงหนึ่งคอลัมน์ที่อาจมีคอลัมน์ที่,ฉันวางไว้ท้ายสุดอย่างไรก็ตามโซลูชันนี้จะลบ,คอลัมน์นั้นออกจากคอลัมน์ที่ฉันไม่ต้องการ
เสือชีต้า

ดูผลลัพธ์ที่สร้างและบอกฉันว่าคุณคิดว่าเป็นที่ต้องการหรือไม่ :) โดยเฉพาะให้สังเกตคอลัมน์คำสั่ง
Oli

tr ' ' ,ที่จะเป็นเช่นเดียวกับ คุณอาจต้องการtr -s ' ' ,ที่นี่
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.