前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux命令(32)——grep命令

Linux命令(32)——grep命令

作者头像
恋喵大鲤鱼
发布2019-02-22 11:20:36
4.5K0
发布2019-02-22 11:20:36
举报
文章被收录于专栏:C/C++基础

1.简介:

grep(Globally search a Regular Expression and Print)是GNU开发的一款免费开源的文本搜索工具。grep家族包括grep、egrep和fgrep。其功能是在指定的文件中查找一个指定格式或者内容的字符串,并将匹配的字符串所在行打印出来。如果不指定任何文件名称,或给定的文件名为“-”,则从标准输入设备读取数据。grep支持正则表达式搜索文本。

2.命令格式

代码语言:javascript
复制
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

3.选项说明

代码语言:javascript
复制
-a,--text:将binary文件以text文件的方式处理,等同于--binary-files=text选项。
-A [行数]:后紧跟数字,为after之意,除了列出匹配字符串所在行之外,后续的n行也列出来。
-b,--byte-offset:在匹配的行之前,标示出该行第一个字符的位编号,即字符在文本中的字节偏移下标,包括换行符。
-B [行数],--before-context=[行数]:后紧跟数字,为befor之意,显示匹配行以及该行之前指定行数的内容。
-c,--count:只输出匹配的行数,不是匹配字符串的个数。
-C [行数],-[NUM],--context=[NUM]:显示匹配的行以及改行上下指定行数的内容。
--color=auto:可以将找到的关键词部分加上颜色的显示。
-d [动作],--directories=[ACTION]:当指定要查找的是目录而非文件时,使用指定的操作处理。动作有:read(默认)像普通文件一样读取目录;skip:忽略指定目录;recurse:递归读取指定目录下的所有文件,此操作等同于-r选项。
-D [ACTION], --devices=[ACTION]:如果输入文件是设备,命名管道(FIFO)或套接字,则使用指定动作处理它。默认情况下,为读取操作(read),这意味着读取设备就像它们是
普通文件。如果操作是跳过(skip),设备将被悄悄跳过。
-e <匹配模式>:设置查找文件内容的匹配模式。
-E,--extended-regexp:使用扩展正则表达式解释匹配模式。
-f [文件], --file=[FILE]:将匹配模式写在文件中,文件中一行内容对应一个匹配模式。
-F,--fixed-strings:将匹配模式看作固定字符串。
-G,--basic-regexp:使用基本正则表达式解释匹配模式。
-h,--no-filename:查询多文件时不显示文件名。
-H,--with-filename:查询多文件时显示文件名(默认选项)。
-i,--ignore-case:忽略字符大小写。
-I:忽略二进制文件。等同于--binary-files=without-match
-l,--files-with-matches:只输出包含匹配字符的文件名。
-L,--files-without-match:不显示内容符合指定的匹配模式的文件名。
-n,--line-number:显示匹配行及行号。
-o,--only-matching:只显示匹配的字符串,并以单独行输出。
-q,--quiet, --silent:静默模式,不显示任何信息到标准输出。
-R, -r, --recursive:递归搜索给定目录下的所有文件。等价于 -d recurse。
-s,--no-messages:不显示不存在或无匹配文本的错误信息。
-T, --initial-tab:使用tab使匹配行对齐;
-u, --unix-byte-offsets:以UNIX样式字节偏移。使用该选项,是grep产生的结果与在Unix机器上相同,此选项必须与-b同时使用,否则没有效果,也必须要在 MS-DOS和MS-Windows平台上使用。
-Z, --null:文件名与匹配行之间使用空字符。grep默认会在每个输出前打印文件名,文件名与匹配行之间会有一个冒号隔开,-Z选项告诉grep不要使用冒号了,使用一个NUL字符;
-v,--invert-match:反向选择,显示不包含匹配文本的所有行。
-V,--version:显示版本信息。
-w,--word-regexp:只显示包含模式字符串的单词(word)的行。
--help:显示帮助信息。
-V, --version:显示版本信息。

4.常用示例

(1)统计字段出现次数。

代码语言:javascript
复制
grep -o [pattern] [finename...]|wc -l

命令解释: (1.1)grep -o -o是only-matching缩写。Print only the matched(non-empty) parts of a matching line, with each such part on a separate output line。以单独的行输出匹配的每一个模式字符串。

(1.2)wc -l 统计输入的行数。就可以知道这个要统计的字段出现的次数了。

(1.3)搜索指定范围的数字。比如查询包包含540-600的行。

代码语言:javascript
复制
grep '5[4-9][0-9]\|600' [filename...] 

之所以竖杠|需要加上反斜杠进行转义,是因为竖杠|在shell中是特殊字符,表示管道命令。可以使用-e选项显示指明为正则表达式,则不需要对|进行转义。

(2)在当前目录下的所有文件中搜索字符串"lvlv",并明确要求搜索子目录中的所有文件。

代码语言:javascript
复制
grep -r "lvlv" .

(3)显示所有以d开头的文件中包含test的行。

代码语言:javascript
复制
grep 'test' d*

(4)打印在aa,bb,cc文件中匹配test的行,并显式行号。

代码语言:javascript
复制
grep -n 'test' aa bb cc

(5)打印aa中包含有至少5个连续小写字符的字符串的所有行

代码语言:javascript
复制
grep '[a-z]\{5\}' aa

注意,这里必须使用双引号或者单引号将查找pattern包围。单引号与双引号的区别主要有: (1)单引号’‘是全引用,被单引号括起的内容不管是常量还是变量都不会发生替换; (2)双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量的内容。一般常量用单引号’'括起,如果含有变量则用双引号""括起来。但是也有意外,比如说查找特殊字符反斜杠\使用:grep '\' ./*则会报grep: Trailing backslash错误,需要使用grep '\\' ./*才可以。

(6)统计文件file中含有指定字符串aaa的的行数。

代码语言:javascript
复制
grep aaa file | wc -l

注意: grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

(6)grep使用多个条件的或查询。

代码语言:javascript
复制
#方法一:使用符号\|
grep "pattern1\|pattern2" filename

#方法二:使用-E选项,用扩展正则表达式解释匹配模式
grep -E "pattern1|pattern2" filename

#方法三:使用-e选项指定多个匹配模式
grep -e "pattern1" -e "pattern2" filename

(7)grep使用多个条件的与查询。

代码语言:javascript
复制
#使用管道命令
grep "pattern1"  filename | grep "pattern2"

参考文献

[1]grep manual [2][Linux]知其然且知所以然之grep命令

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介:
  • 2.命令格式
  • 3.选项说明
  • 4.常用示例
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档