2015-07-28 255 views
2

假设有3个过程名称为abcabcdabcde如何获取特定进程的进程ID?

我使用下面的命令找出进程ID:

ps -ef | grep abc | grep -v grep 

这使输出的所有3个流程与它们对应的PID:

user 6009  1 0 May 11 ?   0:23 ./abc 
user 28047  1 0 Apr 24 ?   0:04 ./abcd 
user 28548  1 0 Apr 27 ?   0:04 ./abcde 

现在我想要什么是一个grep的东西,输出进程ID只是abc而不返回abcdabcde。我知道使用grep -v "processname"消除了我想要的,但有什么简单和具体的?

+0

如果在这里有任何答案,这符合您的需求,那么通过点击绿色的钩子就可以接受那个答案。 – kiigass

回答

6
ps -ef | grep -w abc | grep -v grep 
      ^
       `--- match whole words only 
+0

这正是我想要的。谢谢:) –

+0

@KuntalShaw,不要忘记接受一个答案:http://stackoverflow.com/help/someone-answers –

0
ps -ef | grep -w 'abc$' | grep -v grep 

即线($)结束后abc

+0

不知道约$,因为正确的空间填充 –

+0

它正在与我的'ps' - 我不知道关于这个计划的不同标准。但是,@ eugeniu-rosca建议的'-w'选项可能是保存方式。 – Fiximan

+0

ps -ef | tr'''#'=>有时候空格有时不会。 –

2

为了避免必须管进入grep -v grep,这样做:

ps -ef | grep '[a]bc\>' 

\>是一个终端的单词边界标记,从而你不会匹配“abcd”或“abcde”

将一个字符放入括号表达式意味着正则表达式将匹配字符串abc但它不会匹配字符串grep [a]bc

我这样做往往不够,我写了一个函数,psg

psg() { 
    local -a patterns=() 
    (($# == 0)) && set -- $USER 
    for arg do 
     patterns+=("-e" "[${arg:0:1}]${arg:1}") 
    done 
    ps -ef | grep "${patterns[@]}" 
} 
2

这正是pgrep是。

具体而言,为此,您可以使用pgrep -x abc