grep 是工作中最常使用的命令之一,但是有时候会有不同的搜索要求,例如不搜索某个目录,或者只搜索java文件,等等。
grep 的内容其实挺多,但是本文只讲解日常工作中可能使用到的功能,然而如果你遇到了其它的一些不知道的功能,你可以查询 grep 手册来了解。
语法
grep 命令的语法如下
grep [option...] [patterns] [file...]
grep命令会输出匹配 pattern 的所有行,其中 pattern 默认使用的是 POSIX 的基本正则表达式。
如果在 shell 命令中使用 grep 命令,正则表达式最好加上引号。
选项
grep 手册把选项分为几个部分,下面分部分讲解一些主要的选项。
匹配控制
-e
需要指定一个正则表达式。如果多次指定 -e 选项,或者也指定了-f 选项,那么会对所有的正则表达式进行匹配。
-f
需要指定一个文件名,grep命令会从这个文件的每一行中读取一个正则表达式。如果指定多次 -f 选项,或者与 -e 结合使用,那么会匹配所有的正则表达式。
-i
忽略大小写的匹配。
-v
表示反转匹配,选择非匹配的行。
-w
用于匹配一个单词。单词是由字符,数字,下划线组成。
-x
用于匹配整行。
一般输出控制
-c
只输出匹配的行数,如果与 -v 一起使用,那么输出不匹配的行数。
--color[=WHEN]
这个选项会把输出着色,如果不指定 WHEN 的值,默认为 auto。 在 Ubuntu 系统中, grep 是 grep --color=auto
的别名。
-L
只打印那些没有匹配行的文件名。
-l
与 -L 相反,只打印那些匹配行的文件名。
-m NUM
对于每个文件,只输出 NUM 数量的匹配行。
-o
只输出匹配的部分。
-q
如果发现了任何匹配,立即退出,并且返回状态是0,即使有错误被检测到。
-s
抑制那么关于文件不存在,或者文件不可读的错误信息。
输出行的前缀控制
-H
在输出行的前面还输出文件名。如果搜索的不止一个,那么这个就是默认行为。也就是说,如果搜索目录,那么默认会输出文件名前缀。
-h
在输出行的前面不显示文件名。如果搜索的文件只有一个,那么这个就是默认行为。
--label=LABEL
把来自标准输入的输入显示为来自文件LABLE的输入。
这个选项不常用,但是我还是花了点时间研究了下,这里就顺带讲一下。
如果命令会显示gzip压缩包中文件的内容
$ gzip -cd hello.txt.gz
hello world
This is China.
hello java
hello
通过一个管道,来匹配有 java 单词的行
$ gzip -cd hello.txt.gz | grep java
hello java
如果我们想显示文件名呢,抱歉,通过管道, grep 的输入源来自标准准入 ,通过 -H 显示文件名前缀,这却办不到
$ gzip -cd hello.txt.gz | grep -H java
(standard input):hello java
可以看到,文件名前缀显示为 stand input。那么我们可以通过 --lable 加一个文件名前缀
e$ gzip -cd hello.txt.gz | grep --label="hello.txt" -H java
hello.txt:hello java
-n
显示基于1的行号前缀。
-z
把输出的文件名后面的字符替换为空字符(ASCII值为0)。这是为了防止文件名中有换行符的情况,这就不好处理,这个和 find -print0
的原理类似。
上下文控制
-A NUM
会把匹配行的后面的 NUM 数量的行同时打印出来。
-B NUM
会把匹配行的前面 NUM 数量的行同时打印出来。
-C NUM
会把匹配行的前面和后面的 NUM 行同时打印出来。
文件或目录
–exclude=GLOB
如果文件名的后续匹配了 GLOB 模式,那么会跳过这些文件。这里的模式使用的是通配符。
–exclude-from=FILE
跳过那么匹配 FILE 的文件,FILE 使用通配符。
–exclude-dir=GLOB
如果目录名匹配了 GLOB 模式,那么会跳过这些目录 。GLOB 使用通配符。
–include=GLOB
只匹配那些匹配 GLOB 的文件。 GLOB 使用通配符。
-r
-r 表示递归读取目录。但是如果目录有符号链接,不会读取符号链接指向的文件。
-R
与 -r 类似,区别在于,如果目录下有符号链接,它会读取符号链接指向的文件。
其它选项
-z
这个选项表示命令会把输入和输出的数据当作行的顺序流,每一行由空字符结尾而不换行符。这与 -Z 类似,处理的就是包含换行符的情况。
退出状态
如果匹配到行,那么退出状态为0,如果没有匹配到行,那么退出状态为1,如果发生错误,那么退出状态为2.
如果指定 -s 或 -q,退出状态永远是0。
使用不同类型的正则表达式
grep 默认使用 POSIX 的基本正则表达式,但是可以通过选项指定其它的正则表达式。
-G
使用POSIX基本正则表达式。
-E
使用POSIX的扩展正则表达式。
-F
使用原义进行匹配,而不是当前正则表达式进行匹配。
-p
使用与 perl 兼容的正则表达式。
参考链接
https://www.gnu.org/software/grep/manual/grep.html