How do I pipe the output of grep as the search pattern for another grep?
As an example:
grep <Search_term> <file1> | xargs grep <file2>
I want the output of the first grep as the search term for the second grep. The above command is treating the output of the first grep as the file name for the second grep. I tried using the
-e option for the second grep, but it does not work either.
If using Bash then you can use backticks:
> grep -e "`grep ... ...`" files
-e flag and the double quotes are there to ensure that any output from the initial
grep that starts with a hyphen isn’t then interpreted as an option to the second
Note that the double quoting trick (which also ensures that the output from grep is treated as a single parameter) only works with Bash. It doesn’t appear to work with (t)csh.
Note also that backticks are the standard way to get the output from one program into the parameter list of another. Not all programs have a convenient way to read parameters from stdin the way that (f)grep does.
You need to use
grep ... | xargs -ifoo grep foo file_in_which_to_search
This takes the option after
foo in this case) and replaces every occurrence of it in the command with the output of the first
This is the same as:
grep `grep ...` file_in_which_to_search
grep ... | fgrep -f - file1 file2 ...
I wanted to search for text in files (using grep) that had a certain pattern in their file names (found using find) in the current directory. I used the following command:
grep -i "pattern1" $(find . -name "pattern2")
Here pattern2 is the pattern in the file names and pattern1 is the pattern searched for
within files matching pattern2.
edit: Not strictly piping but still related and quite useful…
This is what I use to search for a file from a listing:
ls -la | grep 'file-in-which-to-search'
Okay breaking the rules as this isn’t an answer, just a note that I can’t get any of these solutions to work.
% fgrep -f test file
% cat test | fgrep -f - file fgrep: -: No such file or directory
% cat test | xargs -ifoo grep foo file xargs: illegal option -- i usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]]
fails. Note that a capital I is necessary. If i use that all is good.
% grep "`cat test`" file
kinda works in that it returns a line for the terms that match but it also returns a line
grep: line 3 in test: No such file or directory for each file that doesn’t find a match.
Am I missing something or is this just differences in my Darwin distribution or bash shell?
I tried this way , and it works great.
[[email protected] abc]$ cat a not problem all problem first not to get read problem read not problem [[email protected] abc]$ cat b not problem xxy problem abcd read problem werwer read not problem 98989 123 not problem 345 345 problem tyu [[email protected] abc]$ grep -e "`grep problem a`" b --col not problem xxy problem abcd read problem werwer read not problem 98989 123 not problem 345 345 problem tyu [[email protected] abc]$
I have found the following command to work using $() with my first command inside the parenthesis to have the shell execute it first.
grep $(dig +short) file
I use this to look through files for an IP address when I am given a host name.