I need help with Grep to start at a section
I have some text files that I want to grep a section of code from. The goal I am trying to achieve is to start the view at a certain line & then be able to read anything below it. For example. In the text below, how do I view the text file at the start point of yellow. I want to view the content of "yellow" as well as everything underneath it, regardless of what that content is.
green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
Solution 1:
AWK
Use AWK
- that's the simplest as it can get:
awk '/yellow/,0' textfile.txt
Sample run
$ awk '/yellow/,0' textfile.txt
yellow
red
orange
more orange
more blue
this is enough
Grep
You could also use grep
with --after-context
option, to print certain amount of lines after the match
grep 'yellow' --after-context=999999 textfile.txt
For automatic setting of context, you could use $(wc -l textfile.txt)
. The basic idea is that if you have a very first line as a match and you want to print everything after that match, you will need to know the number of lines in file minus 1. Luckly, --after-context
won't throw errors about the number of lines, so you could give it number completely out of range, but in case you don't know it, total number of lines will do
$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough
If you want to shorten the command --after-context
is the same option as -A
and $(wc -l textfile.txt)
, will expand to number of lines followed by file name. So that way you type textfile.txt
only once
grep "yellow" -A $(wc -l textfile.txt)
Python
skolodya@ubuntu:$ ./printAfter.py textfile.txt
yellow
red
orange
more orange
more blue
this is enough
DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py
#!/usr/bin/env python
import sys
printable=False
with open(sys.argv[1]) as f:
for line in f:
if "yellow" in line:
printable=True
if printable:
print line.rstrip('\n')
Or alternatively without printable
flag
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if "yellow" in line:
for lines in f: # will print remaining lines
print lines.rstrip('\n')
exit()
Solution 2:
You can do it by:
awk '/yellow/{f=1}f' file
where "file" is the file name containing your text.
Solution 3:
Not grep
, but using sed
:
sed -n '/^yellow$/,$p' file
-
-n
: inhibits printing -
/^yellow$/,$
: address range that goes from the first occurence of a line matching exactlyyellow
to the last line inclusive -
p
: prints the lines in the address range
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
Solution 4:
Late to the party :)
Using grep
:
grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
-P
enables us to use Perl compatible Regex-z
makes the input file separated by ASCII NUL, rather that newline-o
takes only the desired portion(?s)
is the DOTALL modifier, enables us to match newline using token.
(any character)In
\n\K
,\n
matches a newline,\K
discards the matchyellow\n.*
matchesyellow
followed by a newline and everything after this is selected too and shown in the output.
Example:
% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough
Using little python
:
#!/usr/bin/env python2
with open('file.txt') as f:
lines = f.readlines()
print ''.join(lines[lines.index('yellow\n'):])
lines
is the list containing all the lines of the file (with trailing newlines too)lines.index('yellow\n')
gives us the lowest index oflines
whereyellow\n
is foundlines[lines.index('yellow\n'):]
will use list slicing to get the portion starting fromyellow\n
till endjoin
will join the elements of the list to output as a string