diff --git a/grep.md b/grep.md new file mode 100644 index 00000000..c9dc9b02 --- /dev/null +++ b/grep.md @@ -0,0 +1,102 @@ +--- +title: GNU grep +category: CLI +layout: 2017/sheet +updated: 2021-08-23 +--- + +### Usage +{: .-prime} + +```bash +grep pattern +``` + +### Matching options + +```bash +-e, --regexp=PATTERN +-f, --file=FILE +-i, --ignore-case +-v, --invert-match +-w, --word-regexp +-x, --line-regexp +``` + +### Pattern options + +```bash +-F, --fixed-strings # list of fixed strings +-G, --basic-regexp # basic regular expression (default) +-E, --extended-regexp # extended regular expression +-P, --perl-regexp # perl compatible regular expression +``` + +### Expressions + +#### Basic Regular Expressions (BRE) + +In BRE, these characters have a special meaning unless they are escaped with a backslash: + +`^ $ . * [ ] \` + +However, these characters do not have any special meaning unless they are escaped with a backslash: + +`? + { } | ( )` + +#### Extended Regular Expressions (ERE) + +ERE gives all of these characters a special meaning unless they are escaped with a backslash: + +`^ $ . * + ? [ ] ( ) | { }` + +#### Perl Compatible Regular Expressions (PCRE) + +PCRE has even more options such as additional anchors and character classes, lookahead/lookbehind, conditional expressions, comments, and more. See the [regexp cheatsheet](/regexp). + +### Output Options + +```bash +-c, --count # print the count of matching lines. suppresses normal output + --color[=WHEN] # applies color to the matches. WHEN is never, always, or auto +-m, --max-count=NUM # stop reading after max count is reached +-o, --only-matching # only print the matched part of a line +-q, --quiet, --silent +-s, --no-messages # suppress error messages about nonexistent or unreadable files +``` + +### Context Options + +```bash +-B NUM, --before-context=NUM # print NUM lines before a match +-A NUM, --after-context=NUM # print NUM lines after a match +-C NUM, -NUM, --context=NUM # print NUM lines before and after a match +``` + +### Examples + +```bash +# Case insensitive: match any line in foo.txt +# that contains "bar" +grep -i bar foo.txt + +# match any line in bar.txt that contains +# either "foo" or "oof" +grep -E "foo|oof" bar.txt + +# match anything that resembles a URL in +# foo.txt and only print out the match +grep -oE "https?:\/\/((\w+[_-]?)+\.?)+" foo.txt + +# can also be used with pipes: +# match any line that contains "export" in +# .bash_profile, pipe to another grep that +# matches any of the first set of matches +# containing "PATH" +grep "export" .bash_profile | grep "PATH" + +# follow the tail of server.log, pipe to grep +# and print out any line that contains "error" +# and include 5 lines of context +tail -f server.log | grep -iC 5 error +```