专栏首页C/C++基础Linux命令(32)——grep命令

Linux命令(32)——grep命令

1.简介:

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

2.命令格式

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

3.选项说明

-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)统计字段出现次数。

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的行。

grep '5[4-9][0-9]\|600' [filename...] 

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

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

grep -r "lvlv" .

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

grep 'test' d*

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

grep -n 'test' aa bb cc

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

grep '[a-z]\{5\}' aa

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

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

grep aaa file | wc -l

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

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

#方法一:使用符号\|
grep "pattern1\|pattern2" filename

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

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

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

#使用管道命令
grep "pattern1"  filename | grep "pattern2"

参考文献

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux命令(32)——grep命令

    grep(Globally search a Regular Expression and Print)是GNU开发的一款免费开源的文本搜索工具。grep家族包...

    Dabelv
  • 统计无符号整数二进制中1的个数(Hamming weight)

    之所以来记录这个问题的解法,是因为在在线编程中经常遇到,比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题。看似简单的问题,背后却隐藏着很多精妙...

    Dabelv
  • MySQL查看和修改数据库存储目录

    MySQL默认数据库存储目录是在根目录/下,如果根目录存储空间很小的话,我们需要数据库的存储目录,具体方法可参考:MySQL更改数据库数据存储目录。

    Dabelv
  • Linux - 常用命令:grep

    参数 -c 只输出匹配行的个数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n...

    以谁为师
  • 【Go 语言社区】linux 下Go服务器部署(也同样适合C++等)

    作为服务器开发人员,GO语言内网测试数据及调试肯定很简单,如果你在Windows下开发 直接编成EXE执行就可以,然后部署外网在打包成linux的执行文件(交...

    李海彬
  • Redis未授权访问及安全组漏洞招致kerberods来挖矿

    参考文档 https://www.freebuf.com/articles/web/94237.html https://www.4hou.com/vulner...

    三杯水Plus
  • 9.2 grep(中)

    grep用法 grep -n 'root' /etc/passwd grep -nv 'nologin' /etc/passwd grep '[0-9]'/et...

    运维小白
  • 记一次感染挖矿病毒的经历

        下午五点十分、手机开始狂收阿里云ECS实例告警,所有告警都提示机器CPU满载。

    尚浩宇
  • linux命令-grep

    咻一咻
  • 一条命令完成Linux下批量杀死某应用程序相关的进程

    版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

    耕耘实录

扫码关注云+社区

领取腾讯云代金券