我想过滤和格式化 的输出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 并不是最容易理解的命令。我该怎么做?
答案1
如果您愿意获取 pid 的所有数字,您可以使用pgrep
它来为您执行此操作:
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 ""}'