I have a text file named compare.txt
where I want to extract the single line that follows every line that contains the pattern nmse_gain_constant
. The following command gets me close:
grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant
But this includes a separator --
line between every line of desired text. Any easy ideas how to get rid of the --
lines?
Example: for an input file that looks like
line line nmse_gain_constant matching line line after first match line line nmse_gain_constant another matching line line after second match line nmse_gain_constant a third matching line line after third match
the output is
line after first match -- line after second match -- line after third match
but I'd like to have just
line after first match line after second match line after third match
For BSD or GNU grep you can use -B num to set how many lines before the match and -A num for the number of lines after the match. If you want the same number of lines before and after you can use -C num . This will show 3 lines before and 3 lines after.
-v means "invert the match" in grep, in other words, return all non matching lines.
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.
I do this:
grep ... | grep -v -- "^--$"
But this works too (on many, not all OS'es)!
grep --no-group-separator ...
And it doesn't spit out that "--" or even a blank line.
There is an undocumented parameter of grep: "--group-separator", which overrides the default "--". You can set it to "" to get rid of the double dash. Though, you still get an empty line. I had the same trouble, and found this param by reading the source code of grep.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With