pgrep 搜索多个词

pgrep 搜索多个词

我用它pgrep来查找正在运行的进程,其中包含一些单词

> pgrep -f "otp"
2345
2343

识别出多个进程。命令行中还有另一个词可以帮助我找到确切的进程。因此,我想搜索两个词,并且两个词都应该在那里。不幸的是,我只看到了 OR 组合的示例和帮助,如下所示:

> pgrep -f "otp|place1"
2345
2343
3632

这不起作用,因为它是 OR 条件。我的搜索模式中需要一个 AND 条件。

pgrep 参考:https://linux.die.net/man/1/pgrep

pattern:指定用于匹配进程名称或命令行的扩展正则表达式。

如何使用 pgrep 以 AND 组合而不是 OR 形式搜索两个单词?

答案1

我很久以前就放弃了pgrep。总觉得它应该比最后变成的样子更有用。

这是我使用的。有点冗长,总觉得一定有更好的方法,所以也许有人可以启发我们。

egrep允许使用扩展正则表达式进行过滤,这在您只想要“一个答案”时很重要。grep -E应该做同样的事情,但我养成了使用的习惯,egrep因为我想要一个可以在多种 *nix 版本中工作的解决方案。

-e标志指示ps显示所有进程(以执行用户的权限运行。即:除非您是 root,否则不会显示所有进程)。该-f标志指示ps发出“完整格式”列表,您| less在查看时可能需要这样做,因为较长的 CLI 参数可能会从终端的右侧滚动出来,并且可能不会换行。希望对您有所帮助。

查找匹配的进程agetty

# ps -ef | egrep agetty
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root      1388     1  0 Sep19 tty1     00:00:00 /sbin/agetty --noclear tty1 linux
root     28332  4228  0 11:23 pts/2    00:00:00 grep -E agetty

查找其中agetty还包含以下内容的进程匹配baud

# ps -ef | egrep 'agetty.*baud'
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root     28347  4228  0 11:23 pts/2    00:00:00 grep -E agetty.*baud

不要返回我的grep流程。不知道它是如何工作的,但可以让你不必再处理| grep -v 'grep'结果。也许有人可以解释一下:

# ps -ef | egrep 'agetty.*b[a]ud'
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220

egrep 与 OR 条件

# ps -ef | egrep '(ag[e]tty|ac[p]id)'
root       944     1  0 Sep19 ?        00:00:00 /usr/sbin/acpid
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root      1388     1  0 Sep19 tty1     00:00:00 /sbin/agetty --noclear tty1 linux
root     28395  4228  0 11:28 pts/2    00:00:00 grep -E (agetty|acpid)

答案2

找到了一种方法,条件是它们应该按顺序排列:用.*

> pgrep -f "otp.*place1"
2345

相关内容