Linux grep 命令

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值