How to get the n-th line after a grepped one?How can I set up an alias or shortcut to do the *nix find command?Awk responds differently based on how an empty argument is specifiedHow do different operators deal with a given stringConverting multiple files using programs that accepts stdin and output to stdoutBash script not waiting for wget to finish downloadSeeing actual commands typed in bash historyQueue a Bash script to run after currently job finishes?regex to match any combination of text of indeterminate lengthbash: how to print multiple arrays valuesSetting environment variables for Windows cmd temporarily, to run a program, in a single line?
Why does a Star of David appear at a rally with Francisco Franco?
Different outputs for `w`, `who`, `whoami` and `id`
What is a ^ b and (a & b) << 1?
How to write cleanly even if my character uses expletive language?
Non-trivial topology where only open sets are closed
Math equation in non italic font
Happy pi day, everyone!
Do I need to be arrogant to get ahead?
As a new Ubuntu desktop 18.04 LTS user, do I need to use ufw for a firewall or is iptables sufficient?
Recruiter wants very extensive technical details about all of my previous work
What is "focus distance lower/upper" and how is it different from depth of field?
World War I as a war of liberals against authoritarians?
What's the meaning of a knight fighting a snail in medieval book illustrations?
Meme-controlled people
How could a scammer know the apps on my phone / iTunes account?
How should I state my peer review experience in the CV?
Custom alignment for GeoMarkers
Is there a hypothetical scenario that would make Earth uninhabitable for humans, but not for (the majority of) other animals?
Is it true that good novels will automatically sell themselves on Amazon (and so on) and there is no need for one to waste time promoting?
How to plot polar formed complex numbers?
What are substitutions for coconut in curry?
Why is a white electrical wire connected to 2 black wires?
Why do tuner card drivers fail to build after kernel update to 4.4.0-143-generic?
Is there a place to find the pricing for things not mentioned in the PHB? (non-magical)
How to get the n-th line after a grepped one?
How can I set up an alias or shortcut to do the *nix find command?Awk responds differently based on how an empty argument is specifiedHow do different operators deal with a given stringConverting multiple files using programs that accepts stdin and output to stdoutBash script not waiting for wget to finish downloadSeeing actual commands typed in bash historyQueue a Bash script to run after currently job finishes?regex to match any combination of text of indeterminate lengthbash: how to print multiple arrays valuesSetting environment variables for Windows cmd temporarily, to run a program, in a single line?
Consider the following text file
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
I would like to access to the second line after the one which matched four
. This would be the line
six 6
The resulting line (so the one above) would then be piped for further processing (say, a | cut -d' ' -f2
).
Is there a way to do this in bash and other typical utilities? (otherwise I will script it in Python)
linux command-line bash grep
add a comment |
Consider the following text file
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
I would like to access to the second line after the one which matched four
. This would be the line
six 6
The resulting line (so the one above) would then be piped for further processing (say, a | cut -d' ' -f2
).
Is there a way to do this in bash and other typical utilities? (otherwise I will script it in Python)
linux command-line bash grep
1
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago
add a comment |
Consider the following text file
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
I would like to access to the second line after the one which matched four
. This would be the line
six 6
The resulting line (so the one above) would then be piped for further processing (say, a | cut -d' ' -f2
).
Is there a way to do this in bash and other typical utilities? (otherwise I will script it in Python)
linux command-line bash grep
Consider the following text file
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
I would like to access to the second line after the one which matched four
. This would be the line
six 6
The resulting line (so the one above) would then be piped for further processing (say, a | cut -d' ' -f2
).
Is there a way to do this in bash and other typical utilities? (otherwise I will script it in Python)
linux command-line bash grep
linux command-line bash grep
asked 4 hours ago
WoJWoJ
82232238
82232238
1
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago
add a comment |
1
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago
1
1
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago
add a comment |
4 Answers
4
active
oldest
votes
There is nothing wrong with the previous two answers, but I thought I would make you aware that finding the third line after a pattern can be done in a single sed
call:
sed -n "/four/ n; n; p " SourceData.txt
Because a single program does the work, this is more efficient than running multiple filters. The above command outputs the third line after every instance of "four", except where this occurs again in one of the two lines following a match (the other solutions don't handle this case in the expected manner either); also, no output is generated if the pattern is in the last or second-last line of the file, which may or may not be what you want.
To match the first instance only:
sed -n "/four/ n; n; p; q " SourceData.txt
I add this solution because it is worth getting to know sed
and, despite its rather off-putting syntax (regular expressions are bad enough!), it can often be extremely useful. This tutorial is a good introduction.
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
add a comment |
You can use this expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Output is:
six 6
The grep
option "-A 2" states that two lines after the matched line are outputted.
And the tail
option "-n 1" states that only the last 1
lines of this result are returned.
add a comment |
For multiple occurences, and assumming that no lines start with --
:
( grep -A 2 pattern data.txt; echo '--' ) | grep -E -B1 '^--' | grep -Ev '^--'
In slo-mo:
( grep -A 2 pattern data.txt; echo '--' )
prints the pattern and the next two lines, and inserts a--
line between the groups.echo '--'
makes sure that the last group is also followed by--
.grep -E -B1 '^--'
print the separators and the lines just before (whoch are the ones we are looking for)grep -Ev '^--'
drops the separators, leaving only the lines we are looking for.
if you use the-A
,-B
or-C
option thengrep
automatically use--
to separate matches, no need to print it yourself
– phuclv
1 hour ago
add a comment |
This solution prints the current line iff there was a match two lines ago. It is slightly different from other answers (so far) because it won't miss another match even if it occurs soon after the previous match.
awk -v delay=2 'for (i=delay; i>=0; i--) t[i]=t[i-1]; /four/ t[0]="m"; if (t[delay]) print'
Whenever there's a match, the information is stored in t[0]
. With each line the t
array is shifted (including shifting t[-1]
to t[0]
to reset the value of t[0]
). The line is printed iff the array indicates there was a match two lines ago.
You can easily set a different delay (e.g. delay=7
) or use another pattern (e.g. /sda[[:digit:]]/
)
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "3"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1414661%2fhow-to-get-the-n-th-line-after-a-grepped-one%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
There is nothing wrong with the previous two answers, but I thought I would make you aware that finding the third line after a pattern can be done in a single sed
call:
sed -n "/four/ n; n; p " SourceData.txt
Because a single program does the work, this is more efficient than running multiple filters. The above command outputs the third line after every instance of "four", except where this occurs again in one of the two lines following a match (the other solutions don't handle this case in the expected manner either); also, no output is generated if the pattern is in the last or second-last line of the file, which may or may not be what you want.
To match the first instance only:
sed -n "/four/ n; n; p; q " SourceData.txt
I add this solution because it is worth getting to know sed
and, despite its rather off-putting syntax (regular expressions are bad enough!), it can often be extremely useful. This tutorial is a good introduction.
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
add a comment |
There is nothing wrong with the previous two answers, but I thought I would make you aware that finding the third line after a pattern can be done in a single sed
call:
sed -n "/four/ n; n; p " SourceData.txt
Because a single program does the work, this is more efficient than running multiple filters. The above command outputs the third line after every instance of "four", except where this occurs again in one of the two lines following a match (the other solutions don't handle this case in the expected manner either); also, no output is generated if the pattern is in the last or second-last line of the file, which may or may not be what you want.
To match the first instance only:
sed -n "/four/ n; n; p; q " SourceData.txt
I add this solution because it is worth getting to know sed
and, despite its rather off-putting syntax (regular expressions are bad enough!), it can often be extremely useful. This tutorial is a good introduction.
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
add a comment |
There is nothing wrong with the previous two answers, but I thought I would make you aware that finding the third line after a pattern can be done in a single sed
call:
sed -n "/four/ n; n; p " SourceData.txt
Because a single program does the work, this is more efficient than running multiple filters. The above command outputs the third line after every instance of "four", except where this occurs again in one of the two lines following a match (the other solutions don't handle this case in the expected manner either); also, no output is generated if the pattern is in the last or second-last line of the file, which may or may not be what you want.
To match the first instance only:
sed -n "/four/ n; n; p; q " SourceData.txt
I add this solution because it is worth getting to know sed
and, despite its rather off-putting syntax (regular expressions are bad enough!), it can often be extremely useful. This tutorial is a good introduction.
There is nothing wrong with the previous two answers, but I thought I would make you aware that finding the third line after a pattern can be done in a single sed
call:
sed -n "/four/ n; n; p " SourceData.txt
Because a single program does the work, this is more efficient than running multiple filters. The above command outputs the third line after every instance of "four", except where this occurs again in one of the two lines following a match (the other solutions don't handle this case in the expected manner either); also, no output is generated if the pattern is in the last or second-last line of the file, which may or may not be what you want.
To match the first instance only:
sed -n "/four/ n; n; p; q " SourceData.txt
I add this solution because it is worth getting to know sed
and, despite its rather off-putting syntax (regular expressions are bad enough!), it can often be extremely useful. This tutorial is a good introduction.
answered 2 hours ago
AFHAFH
14.4k31938
14.4k31938
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
add a comment |
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
"the other solutions don't handle this case in the expected manner either" – No longer true. :)
– Kamil Maciorowski
32 mins ago
add a comment |
You can use this expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Output is:
six 6
The grep
option "-A 2" states that two lines after the matched line are outputted.
And the tail
option "-n 1" states that only the last 1
lines of this result are returned.
add a comment |
You can use this expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Output is:
six 6
The grep
option "-A 2" states that two lines after the matched line are outputted.
And the tail
option "-n 1" states that only the last 1
lines of this result are returned.
add a comment |
You can use this expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Output is:
six 6
The grep
option "-A 2" states that two lines after the matched line are outputted.
And the tail
option "-n 1" states that only the last 1
lines of this result are returned.
You can use this expression (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Output is:
six 6
The grep
option "-A 2" states that two lines after the matched line are outputted.
And the tail
option "-n 1" states that only the last 1
lines of this result are returned.
answered 4 hours ago
zx485zx485
1,0211913
1,0211913
add a comment |
add a comment |
For multiple occurences, and assumming that no lines start with --
:
( grep -A 2 pattern data.txt; echo '--' ) | grep -E -B1 '^--' | grep -Ev '^--'
In slo-mo:
( grep -A 2 pattern data.txt; echo '--' )
prints the pattern and the next two lines, and inserts a--
line between the groups.echo '--'
makes sure that the last group is also followed by--
.grep -E -B1 '^--'
print the separators and the lines just before (whoch are the ones we are looking for)grep -Ev '^--'
drops the separators, leaving only the lines we are looking for.
if you use the-A
,-B
or-C
option thengrep
automatically use--
to separate matches, no need to print it yourself
– phuclv
1 hour ago
add a comment |
For multiple occurences, and assumming that no lines start with --
:
( grep -A 2 pattern data.txt; echo '--' ) | grep -E -B1 '^--' | grep -Ev '^--'
In slo-mo:
( grep -A 2 pattern data.txt; echo '--' )
prints the pattern and the next two lines, and inserts a--
line between the groups.echo '--'
makes sure that the last group is also followed by--
.grep -E -B1 '^--'
print the separators and the lines just before (whoch are the ones we are looking for)grep -Ev '^--'
drops the separators, leaving only the lines we are looking for.
if you use the-A
,-B
or-C
option thengrep
automatically use--
to separate matches, no need to print it yourself
– phuclv
1 hour ago
add a comment |
For multiple occurences, and assumming that no lines start with --
:
( grep -A 2 pattern data.txt; echo '--' ) | grep -E -B1 '^--' | grep -Ev '^--'
In slo-mo:
( grep -A 2 pattern data.txt; echo '--' )
prints the pattern and the next two lines, and inserts a--
line between the groups.echo '--'
makes sure that the last group is also followed by--
.grep -E -B1 '^--'
print the separators and the lines just before (whoch are the ones we are looking for)grep -Ev '^--'
drops the separators, leaving only the lines we are looking for.
For multiple occurences, and assumming that no lines start with --
:
( grep -A 2 pattern data.txt; echo '--' ) | grep -E -B1 '^--' | grep -Ev '^--'
In slo-mo:
( grep -A 2 pattern data.txt; echo '--' )
prints the pattern and the next two lines, and inserts a--
line between the groups.echo '--'
makes sure that the last group is also followed by--
.grep -E -B1 '^--'
print the separators and the lines just before (whoch are the ones we are looking for)grep -Ev '^--'
drops the separators, leaving only the lines we are looking for.
answered 3 hours ago
xenoidxenoid
3,8193719
3,8193719
if you use the-A
,-B
or-C
option thengrep
automatically use--
to separate matches, no need to print it yourself
– phuclv
1 hour ago
add a comment |
if you use the-A
,-B
or-C
option thengrep
automatically use--
to separate matches, no need to print it yourself
– phuclv
1 hour ago
if you use the
-A
, -B
or -C
option then grep
automatically use --
to separate matches, no need to print it yourself– phuclv
1 hour ago
if you use the
-A
, -B
or -C
option then grep
automatically use --
to separate matches, no need to print it yourself– phuclv
1 hour ago
add a comment |
This solution prints the current line iff there was a match two lines ago. It is slightly different from other answers (so far) because it won't miss another match even if it occurs soon after the previous match.
awk -v delay=2 'for (i=delay; i>=0; i--) t[i]=t[i-1]; /four/ t[0]="m"; if (t[delay]) print'
Whenever there's a match, the information is stored in t[0]
. With each line the t
array is shifted (including shifting t[-1]
to t[0]
to reset the value of t[0]
). The line is printed iff the array indicates there was a match two lines ago.
You can easily set a different delay (e.g. delay=7
) or use another pattern (e.g. /sda[[:digit:]]/
)
add a comment |
This solution prints the current line iff there was a match two lines ago. It is slightly different from other answers (so far) because it won't miss another match even if it occurs soon after the previous match.
awk -v delay=2 'for (i=delay; i>=0; i--) t[i]=t[i-1]; /four/ t[0]="m"; if (t[delay]) print'
Whenever there's a match, the information is stored in t[0]
. With each line the t
array is shifted (including shifting t[-1]
to t[0]
to reset the value of t[0]
). The line is printed iff the array indicates there was a match two lines ago.
You can easily set a different delay (e.g. delay=7
) or use another pattern (e.g. /sda[[:digit:]]/
)
add a comment |
This solution prints the current line iff there was a match two lines ago. It is slightly different from other answers (so far) because it won't miss another match even if it occurs soon after the previous match.
awk -v delay=2 'for (i=delay; i>=0; i--) t[i]=t[i-1]; /four/ t[0]="m"; if (t[delay]) print'
Whenever there's a match, the information is stored in t[0]
. With each line the t
array is shifted (including shifting t[-1]
to t[0]
to reset the value of t[0]
). The line is printed iff the array indicates there was a match two lines ago.
You can easily set a different delay (e.g. delay=7
) or use another pattern (e.g. /sda[[:digit:]]/
)
This solution prints the current line iff there was a match two lines ago. It is slightly different from other answers (so far) because it won't miss another match even if it occurs soon after the previous match.
awk -v delay=2 'for (i=delay; i>=0; i--) t[i]=t[i-1]; /four/ t[0]="m"; if (t[delay]) print'
Whenever there's a match, the information is stored in t[0]
. With each line the t
array is shifted (including shifting t[-1]
to t[0]
to reset the value of t[0]
). The line is printed iff the array indicates there was a match two lines ago.
You can easily set a different delay (e.g. delay=7
) or use another pattern (e.g. /sda[[:digit:]]/
)
answered 35 mins ago
Kamil MaciorowskiKamil Maciorowski
28.3k156186
28.3k156186
add a comment |
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1414661%2fhow-to-get-the-n-th-line-after-a-grepped-one%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Will there always only be one occurrence of what you are trying to match? Will it always be two lines after?
– Nasir Riley
4 hours ago
Use awk? But if you're more familiar with Python that would be quicker.
– MZB
3 hours ago