扩展正则表达式 (ERE):如何在匹配中包含模式但排除模式的特定超集?

扩展正则表达式 (ERE):如何在匹配中包含模式但排除模式的特定超集?

该命令的手册页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

相关内容