use awk to print after/before n lines after match
2014-08-11 17:56
1226 查看
sed -n '1,/Copying/p' bldlinux.log | tail -3
x=`awk '/Copying/{print NR-2","NR}' bldlinux.log `
sed -n "$x p" bldlinux.log
awk '{a[++i]=$0;}/Copying/{for(j=NR-2;j<=NR;j++)print a[j];}' bldlinux.log
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before a pattern match in log files. You will do well to know how to print a few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file
Unix
AIX
Solaris
Linux
SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file
AIX
Solaris
Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print}
> {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file
AIX
Solaris
Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3);
> /Linux/ and print @arr;' file
AIX
Solaris
Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3
AIX
Solaris
Linux
Using sed, a range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file`
$ sed -n "$x p" file
AIX
Solaris
Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using this line range in
sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file
AIX
Solaris
Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac
AIX
Solaris
Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf
The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found.
{N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines, you can simply put:
{N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next
line which is in x.
5. To print only the line following the pattern without the line matching the pattern:
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
Using grep and cut command, the line number of the pattern in the file is found. By
passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using
sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
OR
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf
The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found.
{N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines, you can simply put:
{N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next
line which is in x.
5. To print only the line following the pattern without the line matching the pattern:
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
Using grep and cut command, the line number of the pattern in the file is found. By
passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using
sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
OR
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf Different ways to print the next few lines after pattern match
http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html
grep, awk or a sed command is used to print the line matching a particular pattern. However, at times, we need to print a few more lines following the lines matching the pattern. In this article, we will see the different ways in which we can get this done.
The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
$ cat file
Unix
Linux
Solaris
AIX
SCO
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
$ grep -A1 Linux file
Linux
Solaris
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
$ sed -n '/Linux/{N;p}' file
Linux
Solaris
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found. {N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines,
you can simply put: {N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
$ awk '/Linux/{print;getline;print;}' file
Linux
Solaris
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
$ awk '/Linux/{getline x;print $0 RS x;}' file
Linux
Solaris
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next line which
is in x.
5. To print only the line following the pattern without the line matching the pattern:
$ sed -n '/Linux/{n;p}' file
Solaris
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
$ awk '/Linux/{getline;print;}' file
Solaris
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
$ awk '/Linux/{x=NR+2;next}(NR<=x){print}' file
Solaris
Aix
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
$ x=`grep -n Linux file | cut -f1 -d:`
$ awk -v ln=$x 'NR>=ln && NR<=ln+2' file
Using grep and cut command, the line number of the pattern in the file is found. By passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
$ x=`awk '/Linux/{print NR}' file`
$ y=`awk '/Linux/{print NR+2}' file`
$ sed -n "$x,$y p" file
OR
$ x=`awk '/Linux/{print NR+2}' file`
$ sed -n "/Linux/,$x p" file
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
1. grep will do it for you if your grep is a GNU grep.
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf
x=`awk '/Copying/{print NR-2","NR}' bldlinux.log `
sed -n "$x p" bldlinux.log
awk '{a[++i]=$0;}/Copying/{for(j=NR-2;j<=NR;j++)print a[j];}' bldlinux.log
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before a pattern match in log files. You will do well to know how to print a few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file
Unix
AIX
Solaris
Linux
SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file
AIX
Solaris
Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print}
> {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file
AIX
Solaris
Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3);
> /Linux/ and print @arr;' file
AIX
Solaris
Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3
AIX
Solaris
Linux
Using sed, a range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file`
$ sed -n "$x p" file
AIX
Solaris
Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using this line range in
sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file
AIX
Solaris
Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac
AIX
Solaris
Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf
Different ways to print the next few lines after pattern match
grep, awk or a sed command is used to print the line matching a particular pattern. However, at times, we need to print a few more lines following the lines matching the pattern. In this article, we will see the different ways in which we can get this done.The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
$ cat file Unix Linux Solaris AIX SCO
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
$ grep -A1 Linux file Linux Solaris
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
$ sed -n '/Linux/{N;p}' file Linux Solaris
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found.
{N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines, you can simply put:
{N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
$ awk '/Linux/{print;getline;print;}' file Linux Solaris
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
$ awk '/Linux/{getline x;print $0 RS x;}' file Linux Solaris
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next
line which is in x.
5. To print only the line following the pattern without the line matching the pattern:
$ sed -n '/Linux/{n;p}' file Solaris
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
$ awk '/Linux/{getline;print;}' file Solaris
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file Linux Solaris Aix
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
$ awk '/Linux/{x=NR+2;next}(NR<=x){print}' file Solaris Aix
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
$ x=`grep -n Linux file | cut -f1 -d:` $ awk -v ln=$x 'NR>=ln && NR<=ln+2' file
Using grep and cut command, the line number of the pattern in the file is found. By
passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using
sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
$ x=`awk '/Linux/{print NR}' file` $ y=`awk '/Linux/{print NR+2}' file` $ sed -n "$x,$y p" file
OR
$ x=`awk '/Linux/{print NR+2}' file` $ sed -n "/Linux/,$x p" file
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf
Different ways to print the next few lines after pattern match
grep, awk or a sed command is used to print the line matching a particular pattern. However, at times, we need to print a few more lines following the lines matching the pattern. In this article, we will see the different ways in which we can get this done.The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
$ cat file Unix Linux Solaris AIX SCO
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
$ grep -A1 Linux file Linux Solaris
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
$ sed -n '/Linux/{N;p}' file Linux Solaris
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found.
{N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines, you can simply put:
{N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
$ awk '/Linux/{print;getline;print;}' file Linux Solaris
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
$ awk '/Linux/{getline x;print $0 RS x;}' file Linux Solaris
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next
line which is in x.
5. To print only the line following the pattern without the line matching the pattern:
$ sed -n '/Linux/{n;p}' file Solaris
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
$ awk '/Linux/{getline;print;}' file Solaris
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file Linux Solaris Aix
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
$ awk '/Linux/{x=NR+2;next}(NR<=x){print}' file Solaris Aix
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
$ x=`grep -n Linux file | cut -f1 -d:` $ awk -v ln=$x 'NR>=ln && NR<=ln+2' file
Using grep and cut command, the line number of the pattern in the file is found. By
passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using
sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
$ x=`awk '/Linux/{print NR}' file` $ y=`awk '/Linux/{print NR+2}' file` $ sed -n "$x,$y p" file
OR
$ x=`awk '/Linux/{print NR+2}' file` $ sed -n "/Linux/,$x p" file
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf Different ways to print the next few lines after pattern match
http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html
grep, awk or a sed command is used to print the line matching a particular pattern. However, at times, we need to print a few more lines following the lines matching the pattern. In this article, we will see the different ways in which we can get this done.
The first part explains ways to print one line following the pattern along with the pattern, few examples to print only the line following the pattern and in the end we have ways to print multiple lines following the pattern.
Let us consider a file with the following contents as shown below:
$ cat file
Unix
Linux
Solaris
AIX
SCO
1. The simplest is using the grep command. In GNU grep, there is an option -A which prints lines following the pattern.
$ grep -A1 Linux file
Linux
Solaris
In the above example, -A1 will print one line following the pattern along with the line matching the pattern. To print 2 lines after the pattern, it is -A2.
2. sed has the N command which will read the next line into the pattern space.
$ sed -n '/Linux/{N;p}' file
Linux
Solaris
First, the line containing the pattern /Linux/ is found. The command within the braces will run on the pattern found. {N;p} means read the next line and print the pattern space which now contains the current and the next line. Similarly, to print 2 lines,
you can simply put: {N;N;p}. Example 7 onwards explains for printing multiple lines following the pattern.
3. awk has the getline command which reads the next line from the file.
$ awk '/Linux/{print;getline;print;}' file
Linux
Solaris
Once the line containing the pattern Linux is found, it is printed. getline command reads the next line into $0. Hence, the second print statement prints the next line in the file.
4. In this, the same thing is achieved using only one print statement.
$ awk '/Linux/{getline x;print $0 RS x;}' file
Linux
Solaris
getline x reads the next line into variable x. x is used in order to prevent the getline from overwriting the current line present in $0. The print statement prints the current line($0), record separator(RS) which is the newline, and the next line which
is in x.
5. To print only the line following the pattern without the line matching the pattern:
$ sed -n '/Linux/{n;p}' file
Solaris
The n command reads the next line into the pattern space thereby overwriting the current line. On printing the pattern space using the p command, we get the next line printed.
6. Same using awk:
$ awk '/Linux/{getline;print;}' file
Solaris
Multiple lines after the pattern:
GNU grep may not available in every Unix box. Excluding grep option, the above examples are good only to print a line or two following the pattern. Say, if you have to print some 10 lines after the pattern, the command will get clumsy. Let us now see how
to print n lines following the pattern along with the pattern:
7. To print multiple(2) lines following the pattern using awk:
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix
To print 5 lines after the pattern, simply replace the number 2 with 5. This above example is a little tricky. Once the pattern Linux is found, x is calculated which is current line number(NR) plus 2. So, we will print lines from the current line till the
line number(NR) reaches x.
8. To print 2 lines following the pattern without the line matching the pattern:
$ awk '/Linux/{x=NR+2;next}(NR<=x){print}' file
Solaris
Aix
The next command makes the current line, which is the pattern matched, to get skipped. In this way, we can exclude the line matching the pattern from getting printed.
9. To print 2 lines following the pattern along with the pattern matching line in another way.
$ x=`grep -n Linux file | cut -f1 -d:`
$ awk -v ln=$x 'NR>=ln && NR<=ln+2' file
Using grep and cut command, the line number of the pattern in the file is found. By passing the shell variable to awk, we make it print only those lines whose line number is between x and x+2.
10. One more way using sed and awk combination. First we calculate the from and to line numbers in the variables x and y. Using sed printing range of lines, we can get the same. sed can not only deal with numbers, it can work with variables as well:
$ x=`awk '/Linux/{print NR}' file`
$ y=`awk '/Linux/{print NR+2}' file`
$ sed -n "$x,$y p" file
OR
$ x=`awk '/Linux/{print NR+2}' file`
$ sed -n "/Linux/,$x p" file
- See more at: http://www.theunixschool.com/2012/05/different-ways-to-print-next-few-lines.html#sthash.9JcTMhUL.dpuf
In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf In this article, we will discuss the different ways for how to print a few lines before
a pattern match in log files. You will do well to know how to print a
few lines AFTER a pattern match.
Let us consider a sample file as below. The requirement is to print 2 lines before the pattern 'Linux':
$ cat file Unix AIX Solaris Linux SCO
1. grep will do it for you if your grep is a GNU grep.
$ grep -B2 Linux file AIX Solaris Linux
The option '-B' will give n lines before the pattern. Hence '-B2 Linux' gives 2 lines before the pattern 'Linux' including the line matching the pattern.
2. awk way:
$ awk '/Linux/{for(i=1;i<=x;)print a[i++];print} > {for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=2 file AIX Solaris Linux
In this, an array is used which will always contain 2 lines before the current pattern. Hence, when the pattern is matched, the array contents along with the current pattern is printed.
3. Perl way:
$ perl -ne 'push @arr,$_; shift @arr if(@arr>3); > /Linux/ and print @arr;' file AIX Solaris Linux
On reading a line, the line is pushed into an array named "arr". As and when the array size goes beyond 3, an element is removed from the front. In this way, the array will always contain 3 lines including the current pattern. On encountering the pattern 'Linux',
the array is printed.
4. sed and tail combination:
$ sed -n '1,/Linux/p' file | tail -3 AIX Solaris Linux
Using sed, a
range of lines can be read. sed reads from 1st line till the pattern 'Linux'. From this result, we print the last 3 lines which is nothing but the line containing the pattern and 2 lines before the pattern.
5. awk and sed combination:
$ x=`awk '/Linux/{print NR-2","NR}' file` $ sed -n "$x p" file AIX Solaris Linux
Using awk, the line number range is retrieved using the pattern 'Linux'. NR gives the current line number which is the number of the line containing the pattern, NR-2 gives the gives the number of the line which is 2 lines before. Using thisline
range in sed, the set of lines can be filtered.
6. Another awk way, only if the file is a small one:
$ awk '{a[++i]=$0;}/Linux/{for(j=NR-2;j<=NR;j++)print a[j];}' file AIX Solaris Linux
In this, awk stores the entire file in memory using an array. On encountering the pattern 'Linux', it starts printing from 2 lines before using the for loop. Since awk stores the entire file in memory, this SHOULD not be used in case of large files since it
will cause performance issues.
7. tac command (The least favored option)
$ tac file | grep -A2 Linux | tac AIX Solaris Linux
tac command is reverse of cat command which prints the file in reverse order. On the reversed file, grep for 2 lines above the pattern, and again reverse the output and display. This is just an option, not the preferred one due to its performance. tac command
itself is not good for performance, add to that, using it twice.
Note: tac command is not available in all flavors of Unix. - See more at: http://www.theunixschool.com/2012/08/print-lines-before-pattern-linux.html#sthash.hDKNCoh7.dpuf
相关文章推荐
- use AWK to extract some lines according to some patterns in file
- Designing Software Product Lines with UML : From Use Cases to Pattern-Based Software Architectures
- DOM操作 append prependTo after before
- 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
- CHECKLIST TO USE BEFORE SUBMITTING A PAPER TO A JOURNAL
- 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
- 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
- CHECKLIST TO USE BEFORE SUBMITTING A PAPER TO A JOURNAL
- How does SQL Plan Management match SQL statements to SQL plan baselines?
- Use sed and awk to prettify json
- Use awk to do simple statistics job
- jquery append appendTo before after insertAfter insertBefore prepend prependTo用法区别
- Bug #83713 Slave failed to initialize relay log info after OS crash when use MTS and GTID
- 使用tf.train.match_filenames_once()时报错FailedPreconditionError: Attempting to use uninitialized value X
- How to construct/destruct before/after main()
- Client Print Fails to Load After Microsoft Update 956391
- 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
- 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
- jquery after before append appendto prepend prependto的区别
- use regular expression to delete the lines which we don't need