使用 sed 从 ps 中过滤和提取 PID 作为空格分隔列表

使用 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 并不是最容易理解的命令。我该怎么做?

答案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 ""}'

相关内容