What does grep -v "grep" mean and do?
I was wondering what grep -v "grep"
does and what it means?
Solution 1:
grep -v "grep"
takes input line by line, and outputs only the lines in which grep
does not appear. Without -v
, it would output only the lines in which grep
does appear. See man grep
for details.
As far as the grep
utility is itself concerned, it's unimportant that the pattern grep
passed to it as an argument is the same as its name. But in most cases where grep -v grep
actually appears, this is no coincidence.
grep -v grep
(or grep -v 'grep'
or grep -v "grep"
) often appears on the right side of a pipe whose left side is a ps
command. That is likely where you have seen it. For example, I might be looking for running programs whose names, paths, or command-line arguments suggest they're related to Xfce:
ek@Io:~$ ps x | grep xfce
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
31901 pts/1 S+ 0:00 grep --color=auto xfce
My grep
command was shown in the output, but it's not what I'm looking for. I'm looking for information on processes that were already running when I examined what was running, not the process that's only running because of my effort to examine what is running.
One common way to remove this distraction is to add another pipe to grep -v grep
:
ek@Io:~$ ps x | grep xfce | grep -v grep
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
grep
without -F
treats its pattern as a regular expression rather than a fixed string. So another approach is to write a regular expression that matches exactly xfce
but is written differently. For example:
ek@Io:~$ ps x | grep '[x]fce'
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
This works because [x]
is a character class that matches exactly the letter x
.
One shortcoming of those popular methods is that they'll filter out lines that contain grep
even when they're not the grep
command you just ran yourself. They might not even be grep
commands--just commands whose names, paths, or command-line arguments contain grep
. So, as Sergiy Kolodyazhnyy has pointed out, often neither of those ways (nor any other approach involving piping the output of ps
) is really ideal and, as Nic Hartley mentioned, other ways often use pgrep
. For example:
ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
-
-a
shows the full command line. Omit it to show only the process ID number. -
-f
searches in full command line. Omit it to search only the names.
Solution 2:
grep --help
tells us what -v
flag does:
-v, --invert-match select non-matching lines
You can use -v
flag to print inverts the match; that is, it matches only those lines that do not contain the given word. For example print all line that do not contain the word bar:
$ grep -v bar /path/to/file
(read more...)