当我尝试使用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
之间的区别是什么?
答案 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"。