我知道
ps ax
返回 pid
1 ? Ss 0:01 /sbin/init
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
我只需要清理这些字符串,但我无法使用 sed 来做到这一点,因为我无法编写正确的正则表达式。你能帮助我吗?
答案1
使用 ps 输出格式:
ps -A -o pid
命令的输出格式是最佳选项。o 选项控制输出格式。我在下面列出了一些参数,其余的请参阅“man ps”(如果要使用多个参数,则需要-o pid,cmd,flags
)。
KEY LONG DESCRIPTION
c cmd simple name of executable
C pcpu cpu utilization
f flags flags as in long format F field
g pgrp process group ID
G tpgid controlling tty process group ID
j cutime cumulative user time
J cstime cumulative system time
k utime user time
o session session ID
p pid process ID
Awk 或 Cut 更适合获取列:
一般来说,您不会想要使用正则表达式来选择第一列,而是希望将其通过管道传输到 cut 或 awk 来剪掉第一列,如下所示:
ps ax | awk '{print $1}'
正则表达式是一个选项,即使不是最好的:
如果你使用正则表达式,它可能是这样的:
ps ax | perl -nle 'print $1 if /^ *([0-9]+)/'
$1 仅打印括号中匹配的内容。^ 将 锚定到行首。空格星号表示允许在数字前添加可选空格字符。[0-9]+ 表示一个或多个数字。但我不建议使用正则表达式来完成这项特定任务,明白为什么了吗?:-)
答案2
ps ax | awk '{ print $1; }'
答案3
使用-o切换到自定义格式输出
ps -o pid
正如您明确询问的那样,使用 sed 的坏方法可能是
ps -ax | sed 's#^\( *[0-9]\+\) .*$#\1#'
答案4
ps-eo 进程 或者 ps-eo%p
-e 选择所有进程 -o 格式 pid=进程 id %p 与 pid 相同