Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pipe output to use as the search specification for grep on Linux

Tags:

linux

grep

People also ask

How do you pipe a grep output?

grep is very often used as a "filter" with other commands. It allows you to filter out useless information from the output of commands. To use grep as a filter, you must pipe the output of the command through grep . The symbol for pipe is " | ".

What is the output of grep?

Displaying only the matched pattern : By default, grep displays the entire line which has the matched string. We can make the grep to display only the matched string by using the -o option. 6. Show line number while displaying the output using grep -n : To show the line number of file with the line matched.

How do I search for a grep file in Linux?

The grep command searches through the file, looking for matches to the pattern specified. To use it type grep , then the pattern we're searching for and finally the name of the file (or files) we're searching in. The output is the three lines in the file that contain the letters 'not'.

How do I print grep output?

The grep command prints entire lines when it finds a match in a file. To print only those lines that completely match the search string, add the -x option. The output shows only the lines with the exact match.


You need to use xargs's -i switch:

grep ... | xargs -ifoo grep foo file_in_which_to_search

This takes the option after -i (foo in this case) and replaces every occurrence of it in the command with the output of the first grep.

This is the same as:

grep `grep ...` file_in_which_to_search

Try

grep ... | fgrep -f - file1 file2 ...

If using Bash then you can use backticks:

> grep -e "`grep ... ...`" files

the -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 grep.

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.


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

works fine.

% cat test | fgrep -f - file
fgrep: -: No such file or directory

fails.

% 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?