从命令行和脚本运行时 ps 输出不同

从命令行和脚本运行时 ps 输出不同

我必须创建正在运行的进程的 PID 列表。

这是脚本

ps
echo "fields are "
ps | cut -d' ' -f1

ps正在显示

  PID TTY          TIME CMD
 2168 pts/4    00:00:00 sh
 2177 pts/4    00:00:00 mailx
 5191 pts/4    00:00:00 sh
 6494 pts/4    00:00:00 sh
 6495 pts/4    00:00:00 ps
12154 pts/4    00:00:00 sh
12172 pts/4    00:00:00 mailx
15618 pts/4    00:00:00 bash

但切割管道的输出只是

12154
12172
15618

答案1

问题是cut使用单个空格字符作为分隔符,但由于列名和 4 位 PID 右对齐,因此存在多个前导空格,导致cut输出空行。

另一种方法是使用awk,它可以更好地处理此类输入:

ps | awk '{ print $1 }'

ps在特别的情况下心灵猴子的回答是一个更好的方法。

答案2

完整列表:

ps -eo pid

或者只是您的流程:

ps -o pid

答案3

作为第三种选择,您还可以使用grep

ps | grep -oP '^\s*\d+'

启用-PPerl 正则表达式(对于\s\d+)并-o导致grep仅打印匹配行的匹配部分。

相关内容