1.概述
grep man手册中解释 "print lines mattching a pattern"翻译成中文为 按照匹配的模式打印匹配的行。
要注意两点:
- 1.grep是按行打印的
- 2.是按照模式匹配的
grep [opyion] pattern [file …]
2.[option] 选项
grep的参数选项有很多,接收几个常用的选项
- -n 显示匹配的行号
- -v 反选
- -i 忽略大小写
- -o 只打印匹配的字符串
- -E 使用扩展的正则表达式 与egrep 命令一样
- -A 显示匹配行和之后的#行也显示 after grep -A ‘^core id’ /proc/cpuinfo
- -B 前面的#h行 before
- -C 前后各#行 context
- –color 显示匹配的颜色
3.正则表达式元字符
- 字符匹配
. 任意单个字符
[] 指定范围内的单个字符
[^] 指定范围内除外的单个字符 - 次数匹配
* 匹配前面字符任意次
? 前面的字符可有可无
{m,n} 前面字符至少m次,至多n次 - 位置锚定
^ 行首
$ 行尾
< /b 单词词首
> /b 单词词尾 - 分组
()
/1/2/3
字符集合
具体 man 7 regex
[[:digit:]] 字符集合
[[:lower:]] 所有小写字符集合
[[:upper:]] 所有大写字符集合
[[:punct:]] 标点符号集合
[[:space:]] tab,space 等空白字符集合
[[:alpha:]] 等同[A-Za-z]
[[:alnum:]] 等同[A-Za-z0-9]
外层 [ ]表示匹配指定范围内的单个字符,内层[:lower:] 所有的小写字符
4.基础正则表达式和扩展正则表达式
匹配字符:这部分和基本正则表达式一样
匹配次数:
* 和基本正则表达式一样
? 基本正则表达式是?,二这里没有\。
{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:默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长地去匹配,比如某一行有字符串 abacb,如果搜索内容为 "a.b" 那么会直接匹配 abacb这个串,而不会只匹配ab或acb。
注2:所有的正则字符,如 [ 、 、( 等,若要搜索 * ,而不是想把 * 解释为重复先前字符任意次,可以使用 * 来转义。
grep fgrep egrep
grep 支持基础正则表达式 egrep 支持扩展正则表达式
grep egrep 由于grep搜索要消耗大量的资源,耗费cpu
fgrep 快速查找字符串 不包含元字符 ,直接搜索字符串 用fgrep
5.技巧 [\S\s]
\s 指空白、换行、tab缩进等所有的空白
\S 与\s 相反
[\S\s] 表示所有的字符
[\S\s] [\W\w] 匹配包括出现换行的字符
. 不匹配出现换行的字符
所以一般用[\s\S]表示匹配所有的字符
区别文件名通配符
* 任意长度的任意字符
? 任意单个字符
[] 指定范文内的单个字符
[^] 指定范围除外的单个字符
6.总结
grep 的用法需要多练,用熟之后元字符就记住了;
用grep来匹配日志信息会很有用,可以用此有熟悉grep命令;
如果平时制作字符串的匹配,用fgrep耗内存较少。