How to use the grep command in Linux


grep is a command-line utility for searching plain-text data sets for lines that match a regular expression. Its name comes from the ed command g/re/p (globally search for a regular expression and print matching lines), which has the same effect.

Search any line that contains the word in filename on Linux

grep 'word' filename
grep --help
info grep
man grep
version information
grep --version
grep -V
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.

Search and Filter Files

ifconfig | grep ens33 -A 4
Count Number of Matches
ifconfig | grep inet6 -c
the entire pattern
ifconfig | grep "RUNNING" -w
in Gzipped Files
zgrep –i error syslog.gz
grep -i 'hello world' menu.h main.c
eth0: flags=4163

The syntax for the grep command is as follows:

  grep [OPTION]... PATTERN [FILE]...

Regexp selection:
-E, --extended-regexp
PATTERN is an extended regular expression (ERE)
-F, --fixed-strings
PATTERN is a set of newline-separated fixed strings
-G, --basic-regexp
PATTERN is a basic regular expression (BRE)
-P, --perl-regexp
PATTERN is a Perl regular expression
-e, --regexp=PATTERN
use PATTERN for matching
-f, --file=FILE
obtain PATTERN from FILE
-i, --ignore-case
ignore case distinctions
-w, --word-regexp
force PATTERN to match only whole words
-x, --line-regexp
force PATTERN to match only whole lines
-z, --null-data
a data line ends in 0 byte, not newline
-s, --no-messages
suppress error messages
-v, --invert-match
select non-matching lines
-V, --version
display version information and exit
display this help text and exit
Output control:
-m, --max-count=NUM
stop after NUM matches
-b, --byte-offset
print the byte offset with output lines
-n, --line-number
print line number with output lines
flush output on every line
-H, --with-filename
print the file name for each match
-h, --no-filename
suppress the file name prefix on output
use LABEL as the standard input file name prefix
-o, --only-matching
show only the part of a line matching PATTERN
-q, --quiet, --silent
suppress all normal output
assume that binary files are TYPE; TYPE is 'binary', 'text', or 'without-match'
-a, --text
equivalent to --binary-files=text
equivalent to --binary-files=without-match
-d, --directories=ACTION
how to handle directories; ACTION is 'read', 'recurse', or 'skip'
-D, --devices=ACTION
how to handle devices, FIFOs and sockets; ACTION is 'read' or 'skip'
-r, --recursive
like --directories=recurse
-R, --dereference-recursive
likewise, but follow all symlinks
search only files that match FILE_PATTERN
skip files and directories matching FILE_PATTERN
skip files matching any file pattern from FILE
directories that match PATTERN will be skipped.
-L, --files-without-match
print only names of FILEs containing no match
-l, --files-with-matches
print only names of FILEs containing matches
-c, --count
print only a count of matching lines per FILE
-T, --initial-tab
make tabs line up (if needed)
-Z, --null
print 0 byte after FILE name
Context control:
-B, --before-context=NUM
print NUM lines of leading context
-A, --after-context=NUM
print NUM lines of trailing context
-C, --context=NUM
print NUM lines of output context
same as --context=NUM
use SEP as a group separator
use empty string as a group separator
use markers to highlight the matching strings; WHEN is 'always', 'never', or 'auto'
-U, --binary
do not strip CR characters at EOL (MSDOS/Windows)
-u, --unix-byte-offsets
report offsets as if CRs were not there(MSDOS/Windows)

'egrep' means 'grep -E'. 'fgrep' means 'grep -F'. Direct invocation as either 'egrep' or 'fgrep' is deprecated.

Related Tags

#Linux# #grep#