【问题标题】:Pattern process name match in BashBash 中的模式进程名称匹配
【发布时间】:2023-03-25 07:05:01
【问题描述】:

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

我正在运行这个命令:

netstat -lp | grep 9876

输出 1 行或 0 行。

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

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

所以我想要以下内容:

  1. 如果没有输出,不要做任何事情。
  2. 如果有输出,我想模式匹配18849,所以java 进程`。

那我就杀了它。

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

【问题讨论】:

    标签: bash


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      xargs 中的 -r 标志

      -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.
      

      【讨论】:

      • 不应该是netstat -lp | grep -oP '(?&lt;=LISTEN ).*(?=/java)' | xargs -r kill 吗?
      • @anishsane:谢谢你的收获!现在更新了!你可以删除它!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多