该命令的手册页pgrep
表明该模式“指定用于匹配进程名称或命令行的扩展正则表达式”。显然,扩展正则表达式是原始 UNIX grep 命令中使用的正则表达式的扩展。
我需要能够匹配该字符串,但使用扩展正则表达式'myProcess'
排除该字符串。'test_myProcess'
最初,我假设扩展正则表达式将支持否定后向断言,这导致我得到以下正则表达式:(?<!test_)(myProcess)
。这显然适用于其他正则表达式工具(我在 Regex101 网站上尝试过)。
但是,当我尝试使用 时pgrep
,出现以下错误:Invalid preceding regular expression
。在查看了一些扩展正则表达式页面后,似乎这种类型的正则表达式不存在否定后向断言(或者至少我无法找到对它的任何引用)。我需要知道如何匹配字符串,
'myProcess'
但使用扩展正则表达式排除字符串“test_myProcess”。
编辑: 我想要匹配(或不匹配)的文本示例 所需匹配:
- 我的进程
- /usr/local/bin/myProcess.py
- /usr/bin/myProcess
匹配不是期望:
- 测试我的进程
- /usr/local/bin/test_myProcess.py
- /usr/bin/test_myProcess
现在,我正在考虑运行 pgrep 两次,一次匹配'myProcess'
,一次匹配'test_myProcess'
,并将两次结果的差异作为正确答案。然而,我绝对对替代解决方案感兴趣。
编辑:
请注意,进程名称本身不包含'myProcess'
.它只会出现在该进程的命令行中。进程名称很可能是python2.7
。并且,'myProcess'
不保证占据字符串的开头或结尾。另外,正如所指出的,我想匹配字符串 if'myProcess'
存在,但不匹配 if'test_myProcess'
也存在。
答案1
经过与@don_crissti 的大量讨论后,最终的解决方案是
ps auxf | grep -E '[m]yProcess' | grep -vE 'test_[m]yProcess'
这将首先获取所有包含的行'myProcess'
,然后匹配所有不包含该行的行'test_myProcess'
(-v 反转匹配)。 -E 与括号的结合只是为了防止匹配grep
将在输出中列出的两个进程ps
。事实证明,这比试图找到一个正则表达式来统治所有这些要简单得多。感谢大家的帮助。
答案2
(?<!)
是一个 Perl 正则表达式运算符。标准 ERE 的规范可以找到这里。
听起来你想找到参数列表以 开头myProcess
或包含的进程/myProcess
。
所以:
pgrep -f '(^|/)myProcess'
答案3
那么,您想要pgrep
名称以“myProcess”开头的进程吗?然后使用正则表达式^myProcess
:
pgrep '^myProcess'
在正则表达式中,该^
字符意味着必须在字符串的开头找到后面的内容。
例子:
$ pgrep -a app
3267 nm-applet
3280 /usr/bin/python /usr/share/system-config-printer/applet.py
3297 /usr/lib/mate-panel/wnck-applet
3306 /usr/lib/mate-panel/clock-applet
$ pgrep -a '^app'
3280 /usr/bin/python /usr/share/system-config-printer/applet.py