Linux grep';[p] 名称';忽略';grep';处理';ps-ef';?

Linux grep';[p] 名称';忽略';grep';处理';ps-ef';?,linux,unix,grep,Linux,Unix,Grep,当我试图通过使用ps-ef | grep'processname'找出具体的流程时,它也给出了grep流程 像这样: $ ps -ef | grep 'sleep' root 25309 16242 0 18:08 pts/17 00:00:00 sleep 300 root 25316 6114 0 18:08 pts/2 00:00:00 grep --color=always sleep 为此,我通常使用ps-ef | grep'[p]rocessname

当我试图通过使用
ps-ef | grep'processname'
找出具体的流程时,它也给出了
grep
流程

像这样:

$ ps -ef | grep 'sleep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
root     25316  6114  0 18:08 pts/2    00:00:00 grep --color=always sleep
为此,我通常使用
ps-ef | grep'[p]rocessname'
,许多网站和SO中的链接都建议这样做。现在,我得到了预期的输出

$ ps -ef | grep '[s]leep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
$ ps -ef | grep '[s]leep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
我的问题是,

grep'[p]processname'
如何忽略
grep
进程

因为,当我将输出重定向到某个文件并执行
grep
时。但是,这次它给了我两条线。我感到困惑。这里是我尝试过的

$ ps -ef | grep 'sleep' > input.txt

$ grep 'sleep' input.txt 
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
root     25689  6114  0 18:11 pts/2    00:00:00 grep --color=always sleep

$ grep '[s]leep' input.txt 
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
root     25689  6114  0 18:11 pts/2    00:00:00 grep --color=always sleep

$ cat input.txt  | grep '[s]leep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
root     25689  6114  0 18:11 pts/2    00:00:00 grep --color=always sleep

ps-ef | grep'…'
grep'…'文件
之间的区别是什么?

当您尝试对所有您看到的所有进程进行正常搜索时,包括您的grep和搜索模式

$ ps -ef | grep 'sleep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
root     25316  6114  0 18:08 pts/2    00:00:00 grep --color=always sleep
当您使用
ps-ef | grep'[p]rocessname'
时,您将获得预期的输出

$ ps -ef | grep '[s]leep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
$ ps -ef | grep '[s]leep'
root     25309 16242  0 18:08 pts/17   00:00:00 sleep 300
使用该正则表达式可以启动一个进程,它的ps字符串与自身不匹配,因为正则表达式匹配的是“sleep”,而不是“leep”。这样,您将排除具有字符串“[s]leep”的进程,在本例中,该字符串是grep;同样适用于pgrep、egrep、awk、sed等。。。使用哪个命令定义正则表达式

来自man 7 regex

括号表达式是包含在“[]”中的字符列表。信息技术 通常匹配列表中的任何单个字符(但请参见下文)。
如果列表以“^”开头,则它匹配任何单个字符 (但见下文)不在列表的其他部分。如果输入两个字符 列表以“-”分隔,这是完整范围的缩写 排序序列中这两个(包括)字符之间的, 例如,ASCII中的“[0-9]”匹配任何十进制数字。它是 两个范围共享一个端点是非法的(!),例如“a-c-e”

这是一个简单的把戏

假设您的机器上只有两个
java
进程运行,没有其他进程。使用您的
ps-ef | grep java
您有3个进程

java ...
java ...
grep java
您的grep将为您提供3行输出。因为有三行匹配正则表达式:
java

但是如果您使用
grep'[j]ava'
,则有以下3个过程:

java...
java...
grep [j]ava

最后一行不匹配regex
[j]ava
,它匹配
\[j\]ava
,这就是为什么
grep'[j]ava'
过滤掉最后一个进程,因此只有2行输出行,因为默认的
grep
匹配正则表达式。如果使用固定字符串与
grep-F
匹配,则会得到相反的输出:只是
[p]rocessname