我用它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