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:忽略二进制文件。
-l,--files-with-matches:只输出包含匹配字符的文件名。
-L,--files-without-match:不显示内容符合指定的匹配模式的文件名。
-n,--line-number:显示匹配行及行号。
-o,--only-matching:只显示匹配的字符串,并以单独行输出。
-q,--quiet, --silent:静默模式,不显示任何信息到标准输出。
-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

命令解释: (a)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。以单独的行输出匹配的每一个模式字符串。

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

(c)搜索指定范围的数字。比如查询包包含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。我们利用这些返回值就可进行一些自动化的文本处理工作。


参考文献

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习之旅

Python+Selenium笔记(十三):Page Object设计模式

(一) 前言 简单的说就是分为2层,页面class 和测试class。 页面class:分为父类和子类(子类指具体的页面,每一个页面都创建一个类),父类中定义公...

4357
来自专栏CaiRui

Bash Shell 小试牛刀

一、终端打印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo...

1836
来自专栏coding...

swift3.0 基础练习-实现99乘法表

703
来自专栏运维小白

linux基础(day26)

9.1正则介绍_grep(上) 正则介绍 正则就是一串有规律的字符串 掌握好正则对编写shell脚本帮助交大 各种编程语言中都有正则,原理是一样的 grep/e...

24310
来自专栏大前端_Web

详解ES7的async及webpack配置async

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

4102
来自专栏DT乱“码”

jquery中ajax参数说明

jquery中的ajax方法参数总是记不住,这里记录一下。 1.url:  要求为String类型的参数,(默认为当前页地址)发送请求的地址。 2.type:...

2098
来自专栏JetpropelledSnake

Python入门之用Python统计代码行

Pycharm每天都要写很多代码,如何统计每天的代码行数呢?作为一个目标十万行的coder,要想想办法! 题目:有个目录,里面是你自己写过的程序,统计一下你写过...

3488
来自专栏阮一峰的网络日志

命令行通配符教程

一次性操作多个文件时,命令行提供通配符(wildcards),用一种很短的文本模式(通常只有一个字符),简洁地代表一组路径。

762
来自专栏十月梦想

Promise对象、传参以及错误处理

在大部分情况下我们的程序都是在进行异步操作,需要嵌套多次callback,使得程序变得复杂!ES6中提供了Promise对象,将非阻塞I/O变为阻塞I/O,把异...

4921
来自专栏马涛涛的专栏

模块化、闭包与立即执行函数的使用、MVC里的V和C

将js分成不同的几个模块后,然后使用文件引入,但是会出现问题:如果使用var 声明变量,那么就会成为全局变量,这样容易覆盖.

1751

扫码关注云+社区

领取腾讯云代金券