我想重写这个函数,以便它只显示命令名称和参数,而不必指定所有这些选项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 u
with 的输出进行后处理以进行扩展正则表达式匹配:ps -A -o pid,args
awk
ps -A -o pid,args | RE="$1" awk 'NR==1 || $0 ~ ENVIRON["RE"]'
(注意正则表达式与 pid 和参数列表相匹配)。
这里的正则表达式是awk
通过RE
环境变量传递的,而不是-v
作为:
- 它避免了正则表达式出现在
awk
进程自己的参数列表中,这可能最终导致它被选择。 - 它可以解决反斜杠的损坏(在正则表达式中常见),
-v
否则会发生这种情况。
答案2
不要忘记pgrep
自 2007 年以来就已经存在的实际工具:
答案3
大多数系统都有一个pgrep
命令(最初来自 90 年代末的 Solaris),可以根据进程名称(由 报告ps
)或 arg list(由ps -f
或您的 BSD 风格报告ps u
)来搜索进程。
pgrep -lf extended-regular-expression
将报告其 arg 列表(参数与空格的串联)与扩展正则表达式匹配的进程。
在大多数实现中,包括来自 Solaris 的原始实现、BSD 上的实现和玩具盒 (Android) 实现,带有-l
,返回 pid 以及正则表达式再次匹配的内容,这里带有-f
arg 列表,但来自 procps-ng 的实现为在大多数 GNU/Linux 发行版上都可以找到,但您需要pgrep -af extended-regular-expression
改为。