Text-Processing
使用 sed 從 ps 過濾和提取 PID 作為空格分隔的列表
我想過濾和格式化 的輸出
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 ""}'