Grep
I love grep, and I use it all the time. A closely related program is find.
This is my favorite way to use it. If I am looking for any file with a particular line in it:
grep -rI 'the string' .
Explanation:
- -r: Recurse through directories.
- -I: Ignore binary files.
- 'the string': The string to find. I always use single quotes.
- .: The directory to search through.
Here are the most common patterns I use in grep: (See Regex)
- \|: Alternatives.
- *: The Kleene Star-0 or more of the preceeding.
- \+: One or more.
- \?: Zero or one. In other words, optional.
- \<, \>: Word boundaries. For instance, if I was looking for the word 'python' and not 'pythons' or 'unpythonic', I would type '\<python\>'.
- \(, \): Grouping parens.
Sometimes I want a case-insensitive search (rarely though). Just use the -i option to grep.
I never, never use egrep. I am too used to grep's regex syntax.
-A NUM
|
Show NUM lines after the matching line. |
-B NUM
|
Show NUM lines before the matching line. |
-C NUM
|
Show NUM lines around the matching line. |
--colour
|
Color the matching expressions. Some people do "alias cgrep grep --color". I don't. |
-c
|
Just show how many lines matched. |
-I
|
Ignore binary files. |
-i
|
Ignore case. |
-l
|
Show only the filenames that match. |
-L
|
Show only the filenames that don't match. |
-n
|
Show the line numbers. |
-o
|
Show only the match. |
-r
|
Recurse through directories. |
-v
|
Show lines that don't match the expression. This is great for using with tail when you don't want to see certain lines. |
-P
|
Use perl's regex engine. |
Patterns
See regex.
Most of grep's regex syntax needs to be escaped. Don't forget that bash does some magic on double-quotes, so use single-quotes if possible.
Characters
| [chars] | Any char. You can also use POSIX groups inside. |
| . | Any char. |
| \w | Any word char. |
| \W | Any non-word char. |
| \char | char if char is a special character. |
POSIX groups can be used inside the square brackets. These are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]. Don't forget that these can be combined, as in [[:lower:][:digit:]%].
Grouping
| \(pattern\) | Basic grouping. |
| \| | Alternation. |
Positions
| ^ | Start of line. |
| $ | End of line. |
| \< \> | Beginning, end of word. |
| \b | Word boundary |
| \B | Non-word boundary |
Multipliers
| * | Zero or more |
| \+ | One or more |
| \? | Zero or one |
| \{n\} | n times |
| \{n,m\} | n to m times, inclusive |
| \{n,\} | n or more times |
These are all greedy. Non-greedy has a '\?' after the multiplier.