借鉴来源:https://www.cnblogs.com/flyor/p/6411140.html
Linux中grep命令的用法
作为Linux中最常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。
首先谈一下grep常用格式为:grep [选项] "模式" 文件
grep家族总共有三个:grep,egrep,fgrep
常用选项
-E: 开启扩展(Extend)正则表达式
-i :忽略大小写(ignore case)
-v :反过来(invert),只打印没有匹配到的,而匹配到的反而不打印
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜索的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到
-o :只显示被模式匹配到的字符串
--color :将匹配到的内容以颜色高亮显示
-A n :显示匹配到的字符串所在的行以及其后N行,after
-B n :显示匹配到的字符串所在的行以及其前N行,before
-C n :显示匹配到的字符串所在的行及其前后各N行,context
以上就是各个参数的演示了。应该清楚明了。
模式部分
1、直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度,比如我要匹配一下hello.c文件中printf的个数:fgrep -c "printf" hello.c
2、使用基本正则表达式,下面谈关于基本正则表达式的使用
匹配字符
. :任意一个字符
[abc] :表示匹配一个字符,这个字符必须是abc中的一个
[a-zA-Z] :表示匹配一个字符,这个字符必须是a-z或者A-Z这52个字母中的一个
[^123] :匹配一个字符,这个字符是除了1,2,3以外的所有字符
对于一些常用的字符集,系统做了定义
[A-Za-z] 等价于 [[:alpha:]]
[0-9] 等价于 [[:digit:]]
[A-Za-z0-9] 等价于 [[:alnum:]]
tab,space 等空白字符 [[:space:]]
[A-Z] 等价于 [[:upper:]]
[a-z] 等价于 [[:lower:]]
标点符号 [[:punct:]]
讲解:这里无论是[[:lower:]]或者[[:space:]]都只代表着一个字符,所以如果你要匹配多个字符,那么你要自己往后面加,笔者也是搞了很久才弄清楚,[[:lower:]]这种字符集的用法。
匹配次数
\{m,n\} :匹配其前出现的字符至少m次,至多n次。
\? :匹配其前面出现的内容0次或1次,等价于\{0,1\}
* :匹配其前面出现的内容任意次,等价于\{0,\},所以".*"表述任意字符任意次,即无论什么内容全部匹配
讲解:这里我用了/.*sh即只要包含sh的字符串,前面的字符全部打印
讲解:这里的意思为以/开头,中间可以有0-2个字符,以sh结尾组成的字符串,这里笔者我也是问了许多大佬才理解出来的。有点惭愧
讲解:这里就是单纯的sh结尾,前面2个字符组成的字符串,因为没有固定的开头,所以任意取两字符串就行
位置锚定
^ :锚定行首 如 grep “^h” /etc/passwd 这里就筛选出来的就必须是以h开头的项
$ :锚定行尾。 技巧 :“^$”用于匹配空白行
\b或\< :锚定单词的词首。如“\blike”不会匹配alike,但是会匹配liker. 所以下面连个是相同的意思
\b或\> :锚定词尾。这里的格式为“h\b”或者“h\>”。如“\blike\b”因为锚定的是词首和词尾,所以不会匹配alike或liker,只会匹配like
\B :和\b相反,\b是一定出现在单词首或尾,\B则是一定不出现在单词首或尾,可以是中间
分组及引用
\(string\) :将string作为一个整体方便后面使用
\1:引用第一个左括号及其对应的右括号所匹配的内容
\2:引用第二个左括号及其对应的右括号所匹配的内容
\n:引用第n个左括号及其对应的右括号所匹配的内容
这里使用[[:lower:]]或者[[:alpha:]]结果都是一样的,显示以相同字母开始并结尾的行
扩展(Extend)正则表达式(注意要使用扩展的正则表达式要加-E选项,或者直接使用egrep)
匹配字符:这部分和基本正则表达式一样
匹配次数:
* :和基本正则表达式一样
?:基本正则表达式\?,这里没有\
(m,n):相比基本正则表达式也没有了\
+ :匹配其前面的字符至少一次,相当于{1,}.
位置锚定:和基本正则表达式一样
分组及引用
(string):相比基本正则表达式也没有了\
\1:引用部分和基本正则表达式一样
\n:引用部分和基本正则表达式一样
或者
a | b :匹配a或b,注意a是指 | 的左边的整体,b也同理。比如C | cat 表示的是C或cat,而不是Cat或cat ,如果要表示Cat 或cat,则应该写成为(C | c)at、记住(string)除了用于引用还用于分组
注1:默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长的去匹配,比如某一字符串abacd,如果搜索内容为“a.*b”那么直接匹配abacd这个串,而不会只匹配ab或acd
注2:所有的正则表达式,如[.*(等,若要搜索*,而不是想把*解释为重复先前字符任意次,可以使用\*来转义