grep' [p] rocessname'忽略了' grep'过程中&ps; ps -ef'?

时间:2014-08-20 12:46:04

标签: 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',这已被SO中的许多网站和链接所建议。现在,我得到了预期的输出。

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

我的问题是,

grep '[p]rocessname'如何忽略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 '...' file之间的区别是什么?

2 个答案:

答案 0 :(得分:3)

这是一个简单的伎俩。

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

java ...
java ...
grep java

并且你的grep为你提供了3个输出行。因为三行匹配正则表达式:java

但如果您使用grep '[j]ava'执行此操作,则会有以下3个进程

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

最后一行不匹配正则表达式[j]ava,它与\[j\]ava匹配,这就是为什么grep '[j]ava'过滤了最后一个进程,因此只有2 输出

答案 1 :(得分:0)

当您尝试对所有进行正常搜索时,您会看到所有进程,包括使用搜索模式的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字符串不匹配的进程,因为正则表达式匹配" sleep"而不是" [s] leep"。这样你就可以排除那个字符串" [s] leep"在这种情况下是grep;同样可以应用于pgrep,egrep,awk,sed等......无论你用什么命令来定义正则表达式。

来自man 7 regex

  

括号表达式是" []"中包含的字符列表。它   通常匹配列表中的任何单个字符(但见下文)   如果列表以' ^'开头,则它匹配任何单个字符   (但见下文)不是从列表的其余部分。如果有两个字符   列表以' - '分隔,这是整个范围的简写   在整理顺序中这两个(包括)之间的字符,   例如," [0-9]"在ASCII中匹配任何十进制数字。它是   非法(!)两个范围共享一个端点,例如" a-c-e"。