使用 Bash 从列中提取数字

使用 Bash 从列中提取数字

我只需要bash script_c.sh从此输出中提取进程编号:

11545 pts/3    S+     0:00 bash script_c.sh
11625 pts/3    S+     0:00 grep script_c.sh

在这种情况下,它将是:11545

我努力了

PROCESS=$(ps ax | grep 'bash script_c.sh' | cut -d' ' -f1 | tr -d ' ' | sed '/^$/d')

之后我必须使用它来杀死它kill $PROCESS,但是它不能很好地工作,它说:“必须是一个作业的 pid 等...”。

答案1

经典工具提取列cut

pgrep -fl 'bash script_c.sh' | cut -f1 -d" "

将提取第一列,以单个空格字符分隔。它实际上应该会做你想要的事情。然而,更大的技巧是我使用了pgrep,它具有更好的输出。如果我没有添加开关-l,就不需要cut

pgrep -f 'bash script_c.sh'

然而,对于您的特定任务,您可能只想使用pkill

它允许通过某种模式终止进程,例如

pkill -f "script_c.sh"

最大的好处是pgreppkill有自我意识,只会输出/杀死匹配其他进程。在上面的例子中,您将得到诸如命令之类的误报grep。因此,只需使用pkill任何现代 Linux/BSD 系统上都可用的命令即可。

如果你真的想使用ps(我不推荐):

 ps ax | grep script_c.sh | grep -v grep | sed -e 's/^ *\([0-9]*\) .*/\1/'

或者使用 awk 效果更好(它更擅长自动解析 ps 的列布局):

  ps ax | awk '!/awk/ && /script_c.sh/ { print $1 }'

请注意,对于这两者,您必须确保自己不进行匹配,即从匹配中排除 grep 和 awk。因此使用pgrep会简单得多。pgreppkill都是解决您实际问题的正确工具。

答案2

尝试这个:

PROCESS=$(ps ax | grep 'bash script_c.sh' | sed 's/\([0-9]*\).*/\1/')

相关内容