psgrep 别名显示进程 ID 和命令

psgrep 别名显示进程 ID 和命令

我想重写这个函数,以便它只显示命令名称和参数,而不必指定所有这些选项awk

function psgrep() 
    # show process id and command with arguments
    ps aux | grep "${1:-.}" | grep -v grep | awk '{print $2, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20}'
}

答案1

如果您想搜索特定的可执行文件(从技术上讲,是根据其名称进行处理),某些ps实现(例如 HP/UX(它来自何处)或 of 的实现)procps-ng可以为您完成所有操作:

ps -o pid,args -C "$1"

如果您想要基于进程参数列表进行更一般的搜索(正如您的使用所建议的那样),您可以对例如ps uwith 的输出进行后处理以进行扩展正则表达式匹配:ps -A -o pid,argsawk

ps -A -o pid,args | RE="$1" awk 'NR==1 || $0 ~ ENVIRON["RE"]'

(注意正则表达式与 pid 和参数列表相匹配)。

这里的正则表达式是awk通过RE环境变量传递的,而不是-v作为:

  • 它避免了正则表达式出现在awk进程自己的参数列表中,这可能最终导致它被选择。
  • 它可以解决反斜杠的损坏(在正则表达式中常见),-v否则会发生这种情况。

答案2

不要忘记pgrep自 2007 年以来就已经存在的实际工具:

https://github.com/jvz/psgrep

答案3

大多数系统都有一个pgrep命令(最初来自 90 年代末的 Solaris),可以根据进程名称(由 报告ps)或 arg list(由ps -f或您的 BSD 风格报告ps u)来搜索进程。

pgrep -lf extended-regular-expression

将报告其 arg 列表(参数与空格的串联)与扩展正则表达式匹配的进程。

在大多数实现中,包括来自 Solaris 的原始实现、BSD 上的实现和玩具盒 (Android) 实现,带有-l,返回 pid 以及正则表达式再次匹配的内容,这里带有-farg 列表,但来自 procps-ng 的实现为在大多数 GNU/Linux 发行版上都可以找到,但您需要pgrep -af extended-regular-expression改为。

相关内容