0

I'm writing a bash script where I want to grep the name of a process. This name is the argument when the script is executed.

Normally I can do this ps -ef | grep [w]ord to get the correct processes. How can I have the same effect when the argument to grep (here [w]ord) is something like $1

example:

ps -ef | grep [f]fmpeg

will show lines like this and nothing else

jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg ..

when I want the same behavior within a script and make the argument to grep the argument from the script:

ps -ef | grep "$1"

and call it with ./script.sh ffmpeg it will show me the ffmpeg processes (correct) but also the grep and bash process:

jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg .. jan 118566 117021 0 20:14 pts/4 00:00:00 bash ./script.sh ffmpeg jan 118568 118566 0 20:14 pts/4 00:00:00 grep ffmpeg 

I'm not interested in the last two lines of the output

4
  • Thanks to show us sample input and expected outputCommentedMar 23, 2023 at 19:09
  • ps with -f displays the arg lists of the processes (same as ps -o args), not the process name (ps -o comm). To select processes by name (or arg list), use pgrep (or pgrep -f).CommentedMar 23, 2023 at 19:10
  • It's fine if it shows the argumentsCommentedMar 23, 2023 at 19:17
  • ps -ef | grep [w]ord is wrong. [w]ord is also a glob to the shell, so is expanded to matching files first. Had you used a saner shell like zsh, you'd have seen a no match error (assuming there's no file called word in the current working directory). ps -Af | grep '[w]ord'CommentedMar 23, 2023 at 19:20

3 Answers 3

3

Simply run:

pgrep -fl script.sh 

From man pgrep:

pgrep, pkill, pidwait - look up, signal, or wait for processes based on name and other attributes
-f, --full
The pattern is normally only matched against the process name. When -f is set, the full command line is used.
-l, --list-name
List the process name as well as the process ID. (pgrep only.)

    1

    In shells that support it, you could use the substring expansion to put the brackets in the right places:

    name=ffmpeg ps -ef | grep "[${name:0:1}]${name:1}" 

    would run grep "[f]fmpeg" on the right hand side of the pipeline.

    (That should be relatively safe with most special characters, since they're usually not special within brackets, but don't expect you'd have anything but letters there.)

    Though pgrep is better in that it knows to ignore itself automatically. It just doesn't print everything ps does, but something like this might help with that:

    name=ffmpeg ps -f -p $(pgrep "$name" |tr '\n' ',') 
      0

      Would inverted-match with grep work?

      grep -v 'grep\|script' 

      This will not match grep or script.

        You must log in to answer this question.

        Start asking to get answers

        Find the answer to your question by asking.

        Ask question

        Explore related questions

        See similar questions with these tags.