Linux下如何使用grep搜索文本
2018-11-30
一、什么是grep
grep是一种文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep是几个单词的缩写,g(global)代表全局,re(regular expression)代表搜索的正则表达式,p(print)代表打印。
二、grep命令的常用参数
-A显示符合匹配样式的行,并显示该行之后的内容
-b 显示符合匹配样式的行之前,标示出该行所在的起始位置
-B 显示符合匹配样式的行,并显示该行之前的内容
-c 计算找到的符合行的列数
-C 显示符合匹配样式的行,并显示该列之前和之后的内容
-d 查找目录时,必须使用这个参数
-h 在输出中不显示该列所属的文件名称
-H 在输出中显示每个匹配的文件名
-i 忽略大小写
-l 列出文件内容符合指定匹配样式的文件名称
-L 列出文件内容不符合指定匹配样式的文件名称
-n 输出行号
-o 只打印匹配行的匹配的(非空的)部分,每个部分都在单独的输出行。
-q 不显示任何信息
-r 在每个目录下递归读取所有文件,仅在符号链接之后才读取命令行。
-v 反向选择,即找没有匹配搜索字符串的行
-V 将grep的版本号输出
-w 显示单词匹配的列
-x 显示完全匹配的列
三、grep的使用
grep有很多选项,在这里小研介绍一些重要的选项。
grep简单用法就是grep + 匹配条件 + 文件,打印出gyy.txt文件中包含world的行。如图1所示。
图1 根据单词查找匹配行grep -A 可以显示符合匹配样式的行,并且显示之后的行,
grep -A1 是显示之后的1行,若要显示之后的2行则是grep -A2,以此类推。
如图2所示。
图2 显示匹配行及之后的行
grep -B 可以显示符合匹配样式的行,并且显示之前的行,grep -B1是显示之前的1行,若要显示之前的2行则是grep -B2,以此类推。如图3所示。
图3 显示匹配行和之前的行
grep -b 显示符合匹配样式的行,并标示出该行所在的起始位置,该位置是以字节为单位计算的。该行之前有多少个字节的数据,则该行的起始位置就是该数。这里的起始位置为17。如图4所示。
图4 显示匹配行及该行起始位置grep -c 计算匹配行的数量,如图5所示。
图5 显示匹配行数量
grep -C 显示符合匹配样式的行,并显示该行之前和之后的内容,grep -C1 We gyy.txt命令是搜索gyy.txt文件中包含We的行,并显示该行之前和之后的1行。需要注意C后面需要加上数字来限定。如图6所示。
图6 显示匹配行及该行前后行
-H选项在输出搜索到的结果时会显示所在的文件名,而-h选项则相反不显示文件名,如图7所示。
图7 显示或隐藏文件名grep -i进行比较时忽略大小写,如图8所示。
图8 查找时忽略大小写有时候您可能希望知道所选取的行在文件中的位置。为此可以使用-n选项,如图9所示。
如图9 显示匹配行的行号当您希望在多个文件中搜索特定模式时,使用-l选项非常有用,使用-l选项时,grep不显示包含该模式的行,而是显示包含这种模式的文件名,若是在加上前面说的-i选项可以忽略大小写。如图10所示。
图10 显示包含匹配条件的文件-L选项与-l选项相反,-L选项显示不包含匹配模式的文件,如图11所示。
图11 显示不包含匹配条件的文件-w选项可以精确搜索完整的单词。创建一个文件,文件内容如下:
what it is time now?
I dont't know.
假如您希望显示包含单词“now”的所有行,使用grep now gg.txt命令,打印出的结果也包含了know所在的一行,而使用grep -w 命令,可以准确搜索“now”单词所在的行。如图12所示。
图12 精确查找包含匹配条件的行-v选项可以选取不包含指定模式的所有行,如图13所示。
图13 查找不包含匹配条件的行-x选项也是一个非常有用的选项,使用-x选项可以查找那些完全由指定模式构成的行,如图14所示。
图14 查找匹配条件占整行的行grep使用正则表达式能更好的搜索指定内容。正则表达式,是一种指定字符串模式的简洁方式。创建正则表达式,需要将元字符和普通字符组合起来,再用该正则表达式搜索指定字符串。
元字符^通过匹配指定字符串开头的行,注意为了安全,使用单引号可以确保所有的元字符不是指定字符串的一部分。如图15所示。
图15 查找以匹配条件开头的行使用$可以匹配以指定字符串结尾的行,通过$来查找以know结尾的行。如图16所示。
图16 查找以匹配条件结尾的行^和$也可以一起使用,使用grep '^HELLO$'搜索整行只有HELLO的行,若^和$之间不指定内容则是查找空行。如图17所示。
图17 查找匹配行占整行的行和空行用\可以匹配单词的开头和结尾,\查找整个单词know。如图18所示。
图18 查找匹配条件开头和结尾单词所在行使用\b可以代替\,可以认为\b是边界标记的含义,如图19所示。
图19 查找包含know字符串的行使用[ ]可以匹配括号内的任何字符,[^]匹配不在括号内的任何字符,如图20所示。
图20 查找包含[]内字符的行及取反使用预定义字符匹配指定行,grep [0-9]查找含有数字的行,grep ^[a-z]查找以小写字母开头的行,grep ^[A-Z]查找以大写字母开头的行。[:digit:]类似于[0-9]表示数字,[:lower:]类似于[a-z]表示小写字母,[:upper:]类似于[A-Z]表示大写字母。如图21所示。
图21 使用预定义字符匹配指定行使用元字符.来匹配除换行符\n之外的任意单个字符,grep 'c..l'匹配以c开头后面跟两个任意字符且以l结尾的单词。如图22所示。
图22 查找指定匹配字符串所在行元字符*可以匹配前面的表达式零次或多次,grep 'o*'匹配含有0个或多个o的字符串,grep 'oo*'匹配含有至少一个o的字符串,grep 'ooo*'匹配含有至少2个o的字符串,grep 'oooo*'匹配含有至少3个o的字符串。如图23所示。
图23 查找匹配包含0个或多个指定字符的行.*表示任意字符,grep 'g.*d' yy.txt 匹配以g开头d结尾且中间为任意个字符的字符串。如图24所示。
图24 查找包含指定开头和结尾的字符串所在行至此,Linux系统下grep命令就介绍完了,大家如果有什么问题的话可以在公众号上面留言。