cross-posted from: https://lemmy.run/post/10868
Beginner’s Guide to
grep
grep
is a powerful command-line tool used for searching and filtering text in files. It allows you to find specific patterns or strings within files, making it an invaluable tool for developers, sysadmins, and anyone working with text data. In this guide, we will cover the basics of usinggrep
and provide you with some useful examples to get started.Installation
grep
is a standard utility on most Unix-like systems, including Linux and macOS. If you’re using a Windows operating system, you can install it by using the Windows Subsystem for Linux (WSL) or through tools like Git Bash, Cygwin, or MinGW.Basic Usage
The basic syntax of
grep
is as follows:
grep [options] pattern [file(s)]
options
: Optional flags that modify the behavior ofgrep
.pattern
: The pattern or regular expression to search for.file(s)
: Optional file(s) to search within. If not provided,grep
will read from standard input.Examples
Searching in a Single File
To search for a specific pattern in a single file, use the following command:
grep "pattern" file.txt
Replace
"pattern"
with the text you want to search for andfile.txt
with the name of the file you want to search in.Searching in Multiple Files
If you want to search for a pattern across multiple files, use the following command:
grep "pattern" file1.txt file2.txt file3.txt
You can specify as many files as you want, separating them with spaces.
Ignoring Case
By default,
grep
is case-sensitive. To perform a case-insensitive search, use the-i
option:
grep -i "pattern" file.txt
Displaying Line Numbers
To display line numbers along with the matching lines, use the
-n
option:
grep -n "pattern" file.txt
This can be helpful when you want to know the line numbers where matches occur.
Searching Recursively
To search for a pattern in all files within a directory and its subdirectories, use the
-r
option (recursive search):
grep -r "pattern" directory/
Replace
directory/
with the path to the directory you want to search in.Using Regular Expressions
grep
supports regular expressions for more advanced pattern matching. Here’s an example using a regular expression to search for email addresses:
grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b" file.txt
In this case, the
-E
option enables extended regular expressions.Conclusion
grep
is a versatile tool that can greatly enhance your text searching and filtering capabilities. With the knowledge you’ve gained in this beginner’s guide, you can start usinggrep
to quickly find and extract the information you need from text files. Experiment with different options and explore more advanced regular expressions to further expand your skills withgrep
. Happy grepping!
Did you know the whole grep program was written within a day, by non other then Ken Thompson https://youtube.com/watch?v=NTfOnGZUZDk&feature=share7
I did not.
Thank you for sharing it. Something you learn everyday, eh 😀.
This is cool, but I’d love to see some examples outputs so I can get a sense of what it actually does.
Sure, will try to include output in future. Appreciate the feedback.
I have a concise guide at https://learnbyexample.github.io/cli-computing/searching-files-and-filenames.html#grep and a more detailed book at https://learnbyexample.github.io/learn_gnugrep_ripgrep/introduction.html. Both have examples and exercises.
Good information and barely scratches the surface of grep usage. It can get a lot more complicated but also do a lot more than you think.
Two of my most used grep invocations are:
- Diff two files, showing lines:
grep -xvFf (file2) (file1)
- Show lines that do not contain a string:
grep -rivE '^#' (file)
( only shows uncommented lines for most Linux configuration files)
- Diff two files, showing lines:
Beginner’s Guide to
grep
man grep
You can live without vim, but not without cat and grep.
Very true and I always combine them when I dont need to, using
cat file.txt | grep foo
instead of justgrep foo file.txt
Yeah, IDK why, just feels kinda natural.
Fantastic summary of one of the most universally used cli tool. One thing to add is that the name
grep
comes from theed
commandg/re/p
which stands for “global, regular expression, print” since thats what it does; search everything (global) for a given regular expression (even if the “regular expression” is just a specific string to match) and prints it out. Keeping the name origin in mind helps me to remember what it does.“Using regular expressions” is misleading. A beginner could think that by default
grep
is looking for a literal string, but it does not.A few more options that I use pretty much daily:
-v
for reversing the match (display non-matching instead of matching)-e
to specify multiple patterns, matching any one is sufficient-w
to match only at word boundaries, easier to type than the equivalent regexp-c
for displaying the match count rather than the matches
And some that that I use occasionally:
-NUM
,-B NUM
,-A NUM
also showNUM
lines around/before/after match-l
to display only the filenames with the matches-F
“fixed” pattern meaning literal match only rather than regexp. Great to avoid having to quote regexp special characters when you don’t need regexp matching-P
for PCRE style regexps-f
to read match patterns from a file-q
quiet, only produce exit status, no output. Useful in shell expressions (scripts, one liners).-a
force treating the input as text (useful to override the binary detection heuristic. mnemonic: ascii)
If you are serious about working in a terminal, then I highly recommend learning modern replacements for the old tools.
In this case
ripgrep
(orrg
) https://github.com/BurntSushi/ripgrep is phenomenal. Especially for searching recursively in a large directory tree it is unbelievably quicker than regulargrep
.It won’t be installed on any random machine, so
grep
is still useful, but if you regularly need to text search in files then there are better tools.Yeap, but most of the time you end up trying to figure out issue on remote system, where you don’t have
ripgrep
always installed, but if you have that available on the system you are working on.ripgrep
is always a better alternative.
Excellent guide, thanks for the write up!
One thing I’d like to point out is that you can pipe output from an application into
grep
and then be able to use all the information above.For instance if I want to know the full name of my wireguard interface I can just pass (pipe) the output of
ifconfig
intogrep
:ifconfig | grep wire
Thank you
Very nice guide, thanks for taking the time!
Thank you.