Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

grepping using the result of previous grep

Tags:

Is there a way to perform a grep based on the results of a previous grep, rather than just piping multiple greps into each other. For example, say I have the log file output below:

ID 1000 xyz occured
ID 1001 misc content
ID 1000 misc content
ID 1000 status code: 26348931276572174
ID 1000 misc content
ID 1001 misc content

To begin with, I'd like to grep the whole log file file to see if "xyz occured" is present. If it is, I'd like to get the ID number of that event and grep through all the lines in the file with that ID number looking for the status code.

I'd imagined that I could use xargs or something like that but I can't seem to get it work.

grep "xyz occured" file.log | awk '{ print $2 }' | xargs grep "status code" | awk '{print $NF}'

Any ideas on how to actually do this?

like image 221
Sonoman Avatar asked Feb 06 '13 17:02

Sonoman


People also ask

Can you pipe grep to grep?

1 grep as a Filter. 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 .

How do I display grep results?

To Display Line Numbers with grep MatchesAppend the -n operator to any grep command to show the line numbers. We will search for Phoenix in the current directory, show two lines before and after the matches along with their line numbers.

Can you grep the output of a command?

Using Grep to Filter the Output of a CommandA command's output can be filtered with grep through piping, and only the lines matching a given pattern will be printed on the terminal. You can also chain multiple pipes in on command. As you can see in the output above there is also a line containing the grep process.

How do you get 10 lines before and after grep?

You can use grep with -A n option to print N lines after matching lines. Using -B n option you can print N lines before matching lines. Using -C n option you can print N lines before and after matching lines.


2 Answers

A general answer for grep-ing the grep-ed output:

grep 'patten1' *.txt | grep 'pattern2' 

notice that the second grep is not pointing at a file.

More about cool grep stuff here

like image 77
B.Kocis Avatar answered Sep 20 '22 15:09

B.Kocis


You're almost there. But while xargs can sometimes be used to do what you want (depending on how the next command takes its arguments), you aren't actually using it to grep for the ID you just extracted. What you need to do is take the output of the first grep (containing the ID code) and use that in the next grep's expression. Something like:

grep "^ID `grep 'xyz occured' file.log | awk '{print $2}'` status code" file.log

Obviously another option would be to write a script to do this in one pass, a-la Ed's suggestion.

like image 41
Andy Ross Avatar answered Sep 18 '22 15:09

Andy Ross