文章目录
一、命令介绍二、grep 的三种形式三、常用选项四、正则表达式五、参考示例在指定的文件中查找指定的关键词查看指定文件中含有特定关键词的文本行查看指定文件中所有包含数字的行在指定的目录下递归搜索指定的字符串,将符合的文本行及其文件名输出在指定文件中搜索指定的字符串,将包含该字符串的行以及后面的指定行数都显示出来将指定文件中含有指定字符串的行及其后面指定数量的行打印输出,且打印每行的字节偏移量在指定的多个文件中搜索指定字符串,并且输出匹配的行及其所属的文件名在指定文件中查找指定字符串,且仅输出匹配到的行数在指定目录及其子目录的所有文件中查找指定字符串,并返回匹配到的文本行内容及对应的文件名只在一级子目录中的特定文件中查找指定的关键词(不在当前目录中的文件查找)查看二级子目录(子目录的子目录)中的特定文件中含有指定关键词的文本行内容查看当前目录及其所有子目录下的文件中含有指定关键词的文本行内容及对应文件名显示指定文件中符合范本样式的文本行内容及对应的行号列出文件内容中含有指定关键词的文件名查看指定文件中含有完整匹配搜索词的匹配项的文本行列出指定目录下的文件中匹配范本样式的字符串及对应的文件名查看指定目录下的文件内容含有符合指定范本样式的字符串的文件名称查看指定目录下的文件内容含有匹配正则表达式字符串的文本行内容和文件名查看指定的目录下除了特定文件之外的文件内容中含有指定关键词的文件名限定在指定文件中进行搜索在指定目录下查找,并且将特定的目录排除在搜索范围之外将指定目录中的所有文件所包含的指定字符串替换成另外一个指定的字符串六、grep 和 find 的区别一、命令介绍
grep
是Global Search Regular Expression And Print Out The Line
或Global Regular Expression Print
的简称,意思是全面搜索正则表达式,并将其打印出来。这个命令可以结合正则表达式使用,它也是 Linux 使用最为广泛的命令。
grep
命令的选项用于对搜索过程的补充,而其命令的模式十分灵活,可以是变量、字符串、正则表达式。需要注意的是,一旦模式中包含了空格,务必要用双引号将其引起来。
grep
后面跟着的搜索词可以加上单引号或者双引号,也可以不加任何引号;grep
可以在多种格式的文件中查找指定的内容,例如:json、html、txt、docx 等。
二、grep 的三种形式
Linux 支持三种形式的 grep
grep
:标准 grep 命令egrep
:简称扩展 grep 命令,其实和grep -E
等价,支持基本和扩展的正则表达式fgrep
:简称快速 grep 命令,其实和grep -F
等价,不支持正则表达式,按照字符串表面意思进行匹配
三、常用选项
四、正则表达式
五、参考示例
在指定的文件中查找指定的关键词
在文件 /root/test/text.txt 中查找关键词“world”,会输出匹配到的文本行内容:
[root@htlwk0001host ~]# grep world /root/test/text.txthello shell world!shell world
查看指定文件中含有特定关键词的文本行
查看文件text4.txt
中以Aug
开始的文本行:
[root@htlwk0001host test1]# grep ^Aug text4.txtAugfsdf Augfsdfds
注:^
这是正则表达式的元字符,表示匹配行首。^Aug
表示匹配行首的字符串Aug
查看指定文件中所有包含数字的行
grep [0-9] /var/log/messages # 选择 '/var/log/messages' 文件中所有包含数字的行
在指定的目录下递归搜索指定的字符串,将符合的文本行及其文件名输出
查看目录/var/log
及其所有的子目录中包含字符串"Aug" 的文本行和对应的文件名:
grep Aug -R /var/log/*
在指定文件中搜索指定的字符串,将包含该字符串的行以及后面的指定行数都显示出来
例如,在文件 /root/test/text.txt 中查找字符串“world”,如果存在则将所在行以及后面的3行打印输出:
[root@htlwk0001host ~]# grep -A 3 'world' /root/test/text.txthello shell world! # 该行含有字符串 world,输出此行及其后面的 3 行,但是后面只有 2 行,则输出 2 行dfdskklllllfdfsfdsfshell world # 该行含有字符串 world,输出此行及其后面的 3 行sdffdsfdsfddfsfdfdsfdsfsdfdsfdsfdsf
我们看下文件 /root/test/text.txt 中的实际内容是什么:
[root@htlwk0001host test]# cat text.txthello shell world!dfdskklllllfdfsfdsfshell worldsdffdsfdsfddfsfdfdsfdsfsdfdsfdsfdsffdsfdsfdsfd
选项-A
和数值之间允许有空格,也允许没有空格:
[root@htlwk0001host ~]# grep -A3 'world' /root/test/text.txt
还可以使用选项--after-context
查询,不过该选项和数值之间必须有空格,否则会报错:
[root@htlwk0001host ~]# grep --after-context 3 'world' /root/test/text.txt
另外选项--after-context
还可以使用等号=
来指定数值,但是等号=
左右两端不可以有空格:
[root@htlwk0001host ~]# grep --after-context=3 'world' /root/test/text.txt
将指定文件中含有指定字符串的行及其后面指定数量的行打印输出,且打印每行的字节偏移量
将文件 /root/test/text.txt 中含有字符串“world”的行及其后面的 3 行打印输出,且打印每行的字节偏移量:
[root@htlwk0001host ~]# grep -b3 'world' /root/test/text.txt # 选项 -b 和数值之间不可以有空格0:hello shell world!19-dfdskklllllf # 该行的第 1 个字符 d 正好是前面一行从 h 开始数起的第 19 个字符32-dfsfdsf # 该行的第 1 个字符 d 也正好是前面一行从 d 开始数起的第 13 位,那么加上前面一行 d 的偏移量 19,就是 32 40:shell world # 该行的第 1 个字符 s 是前面一行从 d 开始数起的第 8 位,那么加上前面一行 d 的偏移量 32,就是 4052-sdffdsfdsfd64-dfsfdfdsfds76-fsdfdsfdsfdsf
选项-b
后面不跟着数值,则只打印包含指定字符串的行及其字节偏移量:
[root@htlwk0001host ~]# grep -b 'world' /root/test/text.txt0:hello shell world!40:shell world
还可以使用选项--byte-offset
,但是该选项后面不可以跟着数值:
[root@htlwk0001host ~]# grep --byte-offset 'world' /root/test/text.txt0:hello shell world!40:shell world
还可以指定多个文件进行查找:
[root@htlwk0001host test]# grep -b3 'world' text.txt text1.txttext.txt:0:hello shell world!text.txt-19-dfdskklllllftext.txt-32-dfsfdsftext.txt:40:shell worldtext.txt-52-sdffdsfdsfdtext.txt-64-dfsfdfdsfdstext.txt-76-fsdfdsfdsfdsf--text1.txt:0:dsfdsaljflvoworlddslfljds324432text1.txt-32-sfdsgdflfmbndfkjgrut3409t8ierrigtext1.txt:65:gkldfjgleoeworldsdlfjdlsworldtext1.txt-95-dsfdsfdsftext1.txt-105-fdsfdsfdsfdsfdsfsdfsdfsdftext1.txt-131-dsfsdfdsfsddfgdfgdfgdfgewreeortreoitureoimbn
在指定的多个文件中搜索指定字符串,并且输出匹配的行及其所属的文件名
[root@htlwk0001host ~]# grep -H 'world' /root/test/text.txt /root/test/text2.txt/root/test/text.txt:hello shell world!/root/test/text.txt:shell world
以上结果显示,匹配到两行文本,且这两行内容都是在文件/root/test/text.txt
中。
在指定文件中查找指定字符串,且仅输出匹配到的行数
[root@htlwk0001host test]# grep -c 'world' text.txt text1.txttext.txt:2 # 文件 text.txt 匹配到 2 行text1.txt:2 # 文件 text1.txt 也匹配到 2 行
在指定目录及其子目录的所有文件中查找指定字符串,并返回匹配到的文本行内容及对应的文件名
[root@htlwk0001host test]# grep 'world' -d recurse ././text.txt:hello shell world!./text.txt:shell world./tf_company_0603.sql:Bigworld引擎的游戏开发技术。整个团队的核心成员均来自国内顶尖游戏研发公司,并全部拥有两个以上完整大型MMORPG项目的开发及运营经验。作为拥有国内创业公司中最强开发实力的第四代互联网企业,境界公司旨在为用户创造精致有趣,丰富平衡的3D游戏世界。 公司网址 ', 0.00, 0, 0, 0, 0.0000, '-02-17 14:34:47', '-02-17 14:34:47', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);./tf_company_0603.sql:3, 4, 1, NULL, '无忧互通(),是一家专注于提供最领先的移动游戏和互联网娱乐产品的研发商和运营商。./tf_company_0603.sql:the world, with 45'-02-26 14:47:21', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);./text1.txt:dsfdsaljflvoworlddslfljds324432./text1.txt:gkldfjgleoeworldsdlfjdlsworld[root@htlwk0001host ~]# grep 'make' -d recurse ./test./test/text.html:<p class="p1">ffdsfsmakefdsfsdfmake</p>./test/text.html:<p class="p1">sdfsdfdsmake</p>./test/text.docx:fsdfdsmakesdfsdfsdfds./test/text.docx:makedsfsdfdsfd./test/text.txt:Sdfsd make love3434sdfdsfs./test/text.txt:Fdsfgmake dsfsdf;dgdfdf./test/text.txt:Make ldsfdsfmake lovefsdf343dv.,.,,.fdsfdsf./test/text.json:make lovesdlfjf23423432dsffdsf./test/text.json:sdfldjlfksjff makefsfddsfdsdsf24234ewdfd./test/text.json:sfdmakesdfdsfds
注:选项-d
后面必须跟着操作项(read/skip/recurse)和目录,但是其它两种 ACTION 在实际业务中比较少使用,另外操作项 read 非常奇怪,你指定了 read,后面反而不能跟着目录,必须跟着文件
只在一级子目录中的特定文件中查找指定的关键词(不在当前目录中的文件查找)
[root@htlwk0001host ~]# grep 'make' */*.docxmake23434354
注:第一个*
表示一级子目录,第二个*
表示匹配以docx
为扩展名的任意文件名
查看二级子目录(子目录的子目录)中的特定文件中含有指定关键词的文本行内容
[root@htlwk0001host ~]# grep 'make' */*/*.docxfsdfdsmakesdfsdfsdfdsmakedsfsdfdsfd
注:只在二级子目录下的文件中查找,不会在当前目录、一级子目录及二级子目录下的所有子目录中查找
查看当前目录及其所有子目录下的文件中含有指定关键词的文本行内容及对应文件名
在当前目录及其所有子目录中的文件查找字符串“make”,命令如下:
lwxdeMacBook-Air:test lwx$ grep make -r ../text.html:<p class="p1">ffdsfsmakefdsfsdfmake</p>./text.html:<p class="p1">sdfsdfdsmake</p>./test1/text1.txt:make lovesdfsdfd23423./text.docx:fsdfdsmakesdfsdfsdfds./text.docx:makedsfsdfdsfd./text.txt:Sdfsd make love3434sdfdsfs./text.txt:Fdsfgmake dsfsdf;dgdfdf./text.txt:Make ldsfdsfmake lovefsdf343dv.,.,,.fdsfdsf./text.json:make lovesdlfjf23423432dsffdsf./text.json:sdfldjlfksjff makefsfddsfdsdsf24234ewdfd./text.json:sfdmakesdfdsfds
注:选项-r
表示递归,搜索关键词可以不加引号。
显示指定文件中符合范本样式的文本行内容及对应的行号
[root@htlwk0001host ~]# grep -n 'world' /root/test/text.txt1:hello shell world!4:shell world
列出文件内容中含有指定关键词的文件名
将当前目录及其所有子目录中的文件内容中含有字符串“make”的文件名打印输出:
liaowenxiongdeMacBook-Air:test liaowenxiong$ grep make -r . | cut -d: -f1 | uniq./text.html./test1/text1.txt./text.docx./text.txt./text.json
注:cut
是字符串分割命令,-d
用来定义分割符号,-d:
表示将冒号:
定义为分隔符,-f
显示指定字段的内容,-f1
表示显示第 1 个字段的内容。所以像这样的字符串“./text.docx:makedsfsdfdsfd”,会被分割成“./text.docx”和“makedsfsdfdsfd”,显示第1
个字段的内容就是“./text.docx”,因为同个文件中有多行匹配到指定的关键词,所以分割和取第1
个字段的内容后会存在重复的数据,那么把命令cut
处理后的数据再输出给命令uniq
进行去重后就得到上述的结果了。
查看指定文件中含有完整匹配搜索词的匹配项的文本行
如下图所示:
注:所谓完整匹配范本样式,是指匹配项不仅仅内容匹配,而且匹配项的前后必须跟着非单词字符才行。例如,上图中的字符串“worldworl”的确含有搜索词“world”,但是后面跟着单词字符w
,所以不满足要求。
列出指定目录下的文件中匹配范本样式的字符串及对应的文件名
在把文件内容中所有符合范本样式的字符串打印输出
在当前目录及其所有的子目录下的文件中查找关键词“world”,并将匹配到的字符串打印输出:
[root@htlwk0001host test]# grep world -o -r ../text.txt:world./text.txt:world./text.txt:world./text.txt:world./text.txt:world./text.txt:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./tf_company_0603.sql:world./test1/text4.txt:world./text1.txt:world./text1.txt:world./text1.txt:world
查看指定目录下的文件内容含有符合指定范本样式的字符串的文件名称
查看当前目录及其子目录中的内容含有指定关键词“world”的文件名:
[root@htlwk0001host test]# grep world -l -r ../text.txt./tf_company_0603.sql./test1/text4.txt./text1.txt
注:-l
表示查看内容匹配 pattern 的文件名;-r
表示对指定的目录递归处理。
查看指定目录下的文件内容含有匹配正则表达式字符串的文本行内容和文件名
[root@htlwk0001host test]# grep '[^a-z]oo' -n -r ../text.txt:5:worldeeworld.'oo ./text.txt:6:sdf33oofdsfdsfd./text.txt:8:dfsfdfdsfds=oo
注:-n
表示输出对应的行号,正则表达式可以加单引号或者双引号,也可以不加引号。
查看指定的目录下除了特定文件之外的文件内容中含有指定关键词的文件名
列出目录/etc
及其所有子目录下的文件内容含有关键词“bash”的文件名,但是以.conf
为后缀名的文件不在搜索范围之内:
grep -Ril --exclude=*.conf bash /etc/*
注:--exclude
用来指定被排除的文件
限定在指定文件中进行搜索
只在目录/etc
及其子目录下的配置文件(扩展名为.conf
)中搜索指定的字符串“bash”,并将匹配到的文件名输出:
grep -Ril --include=*.conf bash /etc/*
在指定目录下查找,并且将特定的目录排除在搜索范围之外
查看 /etc 及其子目录中的内容包含完整匹配字符串stretch
的匹配项的文件名,但不包括/etc/grub.d
目录下的文件:
# grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/*/etc/apt/sources.list/etc/dictionaries-common/words/etc/os-release
将指定目录中的所有文件所包含的指定字符串替换成另外一个指定的字符串
将当前目录及其所有子目录中的所有文件内容中的关键词“aliyun” 替换成“lwx”:
[cqs@centos7]$ sed -i "s/aliyun/lwx/g" `grep -rl aliyun ./`
注:后面的grep
命令语句必须放在反撇号之内,这样才会执行该命令语句
六、grep 和 find 的区别
grep 是查找文本内容,所以指定文件时则会进入文件内容中查找,而 find 是查找文件名,无法查找文件的内容