Have you heard this old saw:
UNIX beginners use grep
because it's all they know about.
Intermediate users use fgrep
because the manual says it's
faster.
Advanced users use egrep
because they've tried it.
Yes, despite what the manual page says (or rather, used to say, because
nowadays, many grep
manual pages have been rewritten to
acknowledge the fact), fgrep
is usually the slowest of the
three standard grep
s.
[I believe that fgrep
stands for "fixed grep
"
because it doesn't accept metacharacters. -JP
]
If you want to prove this to yourself, try using the
runtime
program (shown in article
39.4
)
to give you the average execution time of a search.
Here's the result of my
search for the string Waldo
in a large directory crowded with
saved mail files.
% runtime -10 grep Waldo *
...
AVERAGES:
4.13u 0.83s 0:04 0+203k 21+0io 19pf+0w
% runtime -10 fgrep Waldo *
...
AVERAGES:
5.19u 0.80s 0:05 0+195k 4+0io 2pf+0w
% runtime -10 egrep Waldo *
...
AVERAGES:
2.61u 0.76s 0:02 0+244k 0+0io 0pf+0w
On my SPARCstation IPC, grep
managed the search in four seconds,
fgrep
in five, and egrep
in only two. egrep
also used
the least CPU time.
Just for the heck of it, let's see how some other search programs
stack up. sed
, awk
, and perl
can also emulate the
action of grep
:
% runtime -10 sed -n '/Waldo/p' *
...
AVERAGES:
3.64u 1.20s 0:04 0+227k 2+0io 1pf+0w
% runtime -10 awk '/Waldo/' *
...
AVERAGES:
4.86u 0.76s 0:05 0+279k 1+0io 0pf+0w
% runtime -10 perl -ne \'print if \(/Waldo/\) \; \' *
...
AVERAGES:
2.94u 0.69s 0:03 0+498k 28+4io 27pf+0w
(Note that we have to escape any characters that the shell might
interpret in the perl
command line.)
perl
is faster than all but egrep
, but even sed
edges your basic grep
by a hair.
And fgrep
is by far the slowest - it even lost to awk
!
fgrep
|
This doesn't mean that fgrep
is useless, though.
It has a
couple of handy options:
-x
requires a line to be exactly the same as the search pattern;
-f
(27.7
)
takes one or many search patterns from a file.
You can sometimes exploit the fact that fgrep
doesn't understand
regular expressions, and so using it to search for literal asterisks
or other regular expression metacharacters can save you a bit of
quoting.
The time saved on the command line can be worth the slower
execution speed. |