grep 介绍
grep 是一种在 Unix 和类 Unix 操作系统中常用的文本搜索工具,它可以在文件或标准输入中查找指定的文本模式,并将匹配的行打印出来。grep 是 “global search regular expression and print” 的缩写。
grep基本语法
grep 的基本语法为:
grep [options] pattern [file...]
其中,pattern 是要搜索的模式,file 是要搜索的文件名(可以是多个文件,也可以使用通配符指定一组文件),而 options 则控制 grep 的行为。以下是 grep 常用的一些选项:
-A n
:显示匹配行及其后面 n 行的内容。-o
:仅显示匹配到的字符串-B n
:显示匹配行及其前面 n 行的内容。-C n
:显示匹配行及其前后各 n 行的内容。-c
:只显示匹配的行数。-i
:忽略大小写。-v
:反转匹配,只输出不匹配的行。-n
:显示匹配行的行号。-r
:递归搜索目录中的文件。-w
:匹配整个单词,而不是字符串的一部分。
前三个 A、B、C 参数很容易理解,举个栗子,假设我们有一个文件,文件名是 test,内容是从 1 到 9,每个数字一行:
➜ grep -A2 7 test
7
8
9
-A2 7
的效果就是找到 7 ,然后输出 7 后面两行。
同理,-B2 7
和-C2 7
就是找到 7 ,然后分别输出 7 前面两行和前后两行:
➜ grep -B2 7 test
5
6
7
➜ grep -C2 7 test
5
6
7
8
9
继续,假设我们有个名叫 test 的文件内容如下:
➜ cat test
aaaa
bbbbbb
AAAaaa
BBBBASDABBDA
grep -c
命令的作用就是输出匹配到的行数,比如我们想找包含aaa
的有几行,一眼就能看出来有两行,第一行和第三行都包含:
➜ grep -c aaa test
2
grep -e
命令是实现多个匹配之间的或
关系,比如我们想找包含aaaa
或者bbbb
的,显然应该返回第一行和第二行:
➜ grep -e aaaa -e bbbb test
aaaa
bbbbbb
grep -F
相当于fgrep
命令,就是将pattern
视为固定字符串。比如搜索'aa*'
不带-F
和带上,区别如下:
➜ grep 'aa*' test
aaaa
AAAaaa
➜ grep -F 'aa*' test
可以看到第二次就找不到了,因为搜索的是 aa*
这个字符串,而不是正则表达式。
grep -f 文件名
的使用方法是把后面这个文件里的内容当做pattern
。比如我们有个文件,名字是 grep.txt,然后内容是aa*
,使用方法如下:
➜ grep -f grep.txt test
aaaa
AAAaaa
实际上等同于grep 'aa*' test
grep -i --ignore-case
作用是忽略大小写。
grep -n
显示匹配的行号,就是多显示了个行号,不用细说。
grep -o
仅显示匹配到的字符串,还是用刚才的aa*
距离,之前显示的都是匹配到的字符所在的整行,这个命令是只显示匹配到的字符:
➜ grep -o 'aa*' test
aaaa
aaa
grep -q
不打印匹配结果。刚看到这个我疑惑了半天,让你搜索字符串,你不给我结果那有啥用?然后发现还有一条很多教程没说:如果有匹配的内容则立即返回状态值 0。所以一般用在shell
脚本中,在 if
判断里面。
grep -s
不显示错误信息,不解释。
grep -v
显示不被匹配到的行,相当于[^]
反向匹配,最常见的还是用在查找线程的命令里,有时候会打印grep
线程,可以再加上这么一个去除自己:
➜ ps -ef|grep Typora
501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora
501 14814 93748 0 5:33下午 ttys002 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn Typora
➜ ps -ef|grep Typora|grep -v grep
501 91616 1 0 五11上午 ?? 13:39.32 /Applications/Typora.app/Contents/MacOS/Typora
可以看到第二次就没有打印grep
线程自身
grep -w
匹配整个单词,只有完全符合pattern
的单次才会匹配到:
➜ grep aaa test
aaaa
AAAaaa
➜ grep -w aaa test
可以看到第二次结果为空,因为没有aaa
这个单词。