Bash中的模式进程名称匹配

时间:2017-01-27 14:15:50

标签: bash

在bash中,我想杀死一个进程,以防它存在。

我正在运行此命令:

netstat -lp | grep 9876

输出1或0行。

如果它有输出1行,它看起来像这样:

tcp 0 0 *:9876 *:* LISTEN 18449/java

所以我想要以下内容:

  1. 如果没有输出,请不要做任何事情。
  2. 如果有输出,我想模式匹配18849,所以java进程。
  3. 然后我会杀了它。

    我不知道如何做1和2。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

使用启用了-r功能的GNU xargsGNU grep中的PCRE开关,

netstat -lp | grep -oP '(?<=LISTEN ).*(?=/java)' | xargs -r kill

-r

中的xargs标记
-r, --no-run-if-empty
       If the standard input does not contain any nonblanks, do not run the command.  
       Normally, the command is run once even if there is  no  input. This option is a GNU 
       extension.

答案 1 :(得分:4)

bash正则表达式匹配就足够了;不需要grep

regex='LISTEN ([[:digit:]]+)/java'
if [[ $(netstat -lp) =~ $regex ]]; then
    kill "${BASH_REMATCH[1]}"
fi