David LeBauer
David LeBauer

Reputation: 31741

Can I grep only the first n lines of a file?

I have very long log files, is it possible to ask grep to only search the first 10 lines?

Upvotes: 161

Views: 260822

Answers (12)

RajeshK
RajeshK

Reputation: 461

Not sure if I understood your question correctly as it may mean any of following two.

#1 - Grep in first 10 lines

head -10 filename | grep "search string"

#2 - Show first 10 grep result lines

grep "search string" filename | head -10

Upvotes: 0

cxw
cxw

Reputation: 17041

For folks who find this on Google, I needed to search the first n lines of multiple files, but to only print the matching filenames. I used

gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

The FNR..nextfile stops processing a file once 10 lines have been seen. The //..{} prints the filename and moves on whenever the first match in a given file shows up. To quote the filenames for the benefit of other programs, use

gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

Upvotes: 64

Dileepa Chandima
Dileepa Chandima

Reputation: 389

grep -m6 "string" cov.txt

This searches only the first 6 lines for string

Upvotes: -3

vins
vins

Reputation: 69

head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: print two lines before the pattern.

-B 2: print two lines after the pattern.

head -10 log.txt # read the first 10 lines of the file.

Upvotes: 5

RoG
RoG

Reputation: 849

An extension to Joachim Isaksson's answer: Quite often I need something from the middle of a long file, e.g. lines 5001 to 5020, in which case you can combine head with tail:

head -5020 file.txt | tail -20 | grep x

This gets the first 5020 lines, then shows only the last 20 of those, then pipes everything to grep.

(Edited: fencepost error in my example numbers, added pipe to grep)

Upvotes: 3

Zsolt Botykai
Zsolt Botykai

Reputation: 51613

Or use awk for a single process without |:

awk '/your_regexp/ && NR < 11' INPUTFILE

On each line, if your_regexp matches, and the number of records (lines) is less than 11, it executes the default action (which is printing the input line).

Or use sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

Checks your regexp and prints the line (-n means don't print the input, which is otherwise the default), and quits right after the 10th line.

Upvotes: 28

snowtop
snowtop

Reputation: 41

grep -A 10 <Pattern>

This is to grab the pattern and the next 10 lines after the pattern. This would work well only for a known pattern, if you don't have a known pattern use the "head" suggestions.

Upvotes: 0

Alan Haggai Alavi
Alan Haggai Alavi

Reputation: 74242

The output of head -10 file can be piped to grep in order to accomplish this:

head -10 file | grep …

Using Perl:

perl -ne 'last if $. > 10; print if /pattern/' file

Upvotes: 3

jaypal singh
jaypal singh

Reputation: 77105

grep "pattern" <(head -n 10 filename)

Upvotes: 5

Gustavo Straube
Gustavo Straube

Reputation: 3861

You can use the following line:

head -n 10 /path/to/file | grep [...]

Upvotes: 3

Joachim Isaksson
Joachim Isaksson

Reputation: 180917

The magic of pipes;

head -10 log.txt | grep <whatever>

Upvotes: 225

Dan Fego
Dan Fego

Reputation: 14004

You have a few options using programs along with grep. The simplest in my opinion is to use head:

head -n10 filename | grep ...

head will output the first 10 lines (using the -n option), and then you can pipe that output to grep.

Upvotes: 10

Related Questions