2015-07-28 7 views
2

Скажем, 3 процесса с именами abc, abcd и abcde.Как получить идентификатор процесса конкретного процесса?

Я использую следующую команду, чтобы узнать идентификатор процесса:

ps -ef | grep abc | grep -v grep 

Это дает выход для всех 3-х процессов с их соответствующими PIDs:

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-вещью, которая выводит идентификатор процесса только abc без возврата abcd и abcde. Я знаю, что использование 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' - Я бы не знал о разных стандартах в отношении этой программы. Но, вероятно, опция '-w', предложенная @ eugeniu-rosca, является экономичным способом. – 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.