![从命令行和脚本运行时 ps 输出不同](https://linux22.com/image/46401/%E4%BB%8E%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%92%8C%E8%84%9A%E6%9C%AC%E8%BF%90%E8%A1%8C%E6%97%B6%20ps%20%E8%BE%93%E5%87%BA%E4%B8%8D%E5%90%8C.png)
我必须创建正在运行的进程的 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+'
启用-P
Perl 正则表达式(对于\s
、\d
和+
)并-o
导致grep
仅打印匹配行的匹配部分。