Text-Processing

使用 sed 從 ps 過濾和提取 PID 作為空格分隔的列表

  • August 29, 2015

我想過濾和格式化 的輸出ps -ax -o pid,command,但不確定要使用什麼管道。

我想過濾那些在固定位置匹配固定字元串的行,只保留匹配行的 pid,並將它們輸出為空格分隔的列表,例如1234 5678 33121.

我可以使用 輕鬆完成第一步| egrep 'regex',但第二步可能需要 sed 或其他東西,我無法解決。由於 sed(和 awk)也處理正則表達式過濾,我可能不需要 grep。

多個空格字元很好,排序順序並不重要,因此無需修剪 PID 或對行進行排序。例子:

$ ps -ax -o pid,command

 PID COMMAND
   0 [kernel]
   1 /sbin/init --
...
 255 /usr/local/sbin/check_status
 268 /sbin/devd -q
1435 (unlinkd) (unlinkd)
1974 sleep 60
7414 /bin/sh /var/db/test/update.sh
21848 ps -ax -o pid,command
39207 /usr/local/sbin/syslog-ng -p /var/run/syslog-ng.pid

查找命令以 /usr/ 開頭的所有程序(即行matching /usr/ in chars 7-11或正則表達式),並在以空格分隔的單行上^[0-9 ]{5}\s\/usr\/返回它們的 pid(或)。first 5 chars輸出:

255 39207   (no \n's, amount of spacing unimportant).

我已經嘗試過,但 sed 並不是最容易弄清楚的命令。我該怎麼做?

如果您願意獲取可以用來pgrep為您執行此操作的 pid 的所有數字:

pgrep -d " " -f ^/usr

將列印以空格分隔的所有程序的 PID 列表,其命令以/usr

如果您真的想使用該ps命令,那awk將是一個比做sed您想做的更好的工具。您可以這樣做,只需 PID 的前 5 個字元,例如:

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%s ", substr($1,0,5));} END {print ""}'

這將檢查第二個欄位是否以開頭,/usr如果是,則列印第一個欄位的前 5 個字元,後跟一個空格,然後我在末尾添加了一個換行符,但如果你不這樣做,你可以刪除它即使在最後也不想要換行符

正如 Giles 指出的那樣,您可能永遠不會真正想要 PID 的前 5 個字元(這可能是我誤讀了問題),所以使用更有用的答案awk是:

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%d ", $1);} END {print ""}'

引用自:https://unix.stackexchange.com/questions/226193