目录
背景
在工作中我们经常需要查看日志来迅速的定位问题,同时发生故障时我们要经常的统计日志中相关的内容,那么掌握一些常用的日志操作命令就非常必要了。
之前介绍了查看文件过程中经常使用到的命令,但是我们在某些精细化的场景中也不能满足要求,比如单扣出某个字符,id等,所以这里我们要学习一个很重要的东西-正则表达式。我们先来了解一些正则表达式的语法。
参考资料
http://www.delorie.com/gnu/docs/grep/grep_toc.html#SEC_Contents
https://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.110).aspx
字符类操作系统字符分类
[xxx] 表达式
有一类表达式通过 [ 和 ] 将一系列字符包含在其中,如[a2],它的意思是匹配出 [ ] 包含的任意一个字符,比如[a2]就能匹配出含有a或2的数据。如果[]中包含的第一个字符是 ^ ,就代表匹配任何不在 [ ] 中包含的字符。比如[^a2]就能匹配出任何不含有a或者不含有2的数据。
表示变化
当表达一种区间时,我们才用连接符 - 来连接字符表达,它可以匹配到范围中的任何一个字符,比如[a-c]可以匹配到a或者b或者c。 最后我们了解一些已经预先为我们考虑而设定好的一些特殊字符类:
- [:alnum:]
- 匹配英文大小写字符和数字(0-9,a-z.A-Z),等效于[:alpha:]和[:digit:]结果合集。
命令 echo "a\nB\nf\n1\n\!\n\t\n#" | grep --color=auto -e "[[:alnum:]]" 结果: a B f 1
- [:alpha:]
- 代表任何英文大小写字符(A-Z, a-z),等效于[:lower:]和[:upper:]结果合集。
命令 echo "a\nB\nf\n1\n\!\n\t\n#" | grep --color=auto -e "[[:alpha:]]" 结果: a B f
- [:blank:]
- 代表空白字符,代表空格键与[Tab]按键两者。
命令 echo "a\nB\nf\n1\n\!\n\t\n#" | grep --color=auto -e "[[:blank:]]" 结果: \t
- [:cntrl:]
- 代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
- [:digit:]
- 代表数字:0,1,2,3,4,5,6,7,8,9
- [:graph:]
- 代表除了空格符合tab键之外的所有按键,实际就是等效于[:alnum:]和[:punct:]结果合集。
- [:lower:]
- 代表所有小写英文字母。a-z
- [:print:]
- 代表任何可以被打印出来的字符,等效于[:alnum:]和[:punct]和空格
- [:space:]
- 代表任何会产生空白的字符,包括空格键, [Tab], CR , 回车,换行等等
- [:upper:]
- 代表所有大写英文字母,A-Z
- [:xdigit:]
- 代表16进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符
还有一些tips
如果你使用 [ ] 中包含的字符有],那么一定把它放在首位,比如[]ab],会匹配]或者a或者b,[][ab],会匹配]或者[或者a或者b,[^]]会匹配]之外的所有字符。
转义符号
字符类别 | 代表意义 |
---|---|
\c | 控制字符 |
\s | 代表空格 |
\S | 代表不是空格 |
\d | 代表数字 |
\D | 代表不是数字 |
\w | 代表是单词,等价于[[:alnum]] |
\W | 代表不是单词,等价于[^[:alnum]] |
\xhh | 代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符 |
\Oxxx | 代表八进制的字符,亦即0-7 |
# 定位点
锚标记 | 代表意义 |
---|---|
^ | 行首,比如:echo "a\nB\nf\n1\n\!\n\t\n#\n \nba" | grep --color=auto -e "^a" 只会匹配到a这一行 |
\A | 字符串的开始 |
$ | 行尾,比如:echo "a\nB\nf\n1\n\!\n\t\n#\n \nba" | grep --color=auto -e "a$"会匹配到a,ba这两行 |
\Z | 字符串的结束 |
\b | 单词的边界,比如"\brat\b"只能匹配"rat" |
\B | 不是单词的边界,比如"c\Breat\Be"能匹配"create",但是"dirty \Brat"不能匹配"dirty rat" |
\< | 单词的开头 |
\> | 单词的结尾 |
限定符(修饰数量)
量词 | 代表意义 |
---|---|
{3} | 只出现3次 |
{3,} | 出现3次以上 |
{3,5} | 出现3次,4次或者5次 |
{3,5}? | 单词的开头 |
? | 等效于{0,1} |
?? | ?的非贪心模式 |
* | 出现0次或者多次,等价于{0,} |
*? | *的非贪心模式 |
+ | 出现1次或者多次,等价于{1,} |
+? | +的非贪心模式 |
我们看到表中有几行解释是飞贪心模式,什么是非贪心模式呢?
当 ? 紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。
范围修饰
范围 | 代表意义 |
---|---|
. | 代表任何字符除开换行符(\n) |
(a|b) | a或者b |
(...) | |
(?:...) | |
[abc] | a或者b或者c,只能匹配其中一个 |
[^abc] | 不是a或者不是b或者不是c,只能匹配其中一个 |
[a-q] | 代表小写字母a~q,只出现一次 |
[A-Q] | 代表大写字母A~Q,只出现一次 |
[0-7] | 代表数字0~7,只出现一次 |
非打印字符
范围 | 代表意义 |
---|---|
. | 代表任何字符除开换行符(\n) |
(a|b) | a或者b |
(...) | |
(?:...) | |
[abc] | a或者b或者c,只能匹配其中一个 |
[^abc] | 不是a或者不是b或者不是c,只能匹配其中一个 |
[a-q] | 代表小写字母a~q,只出现一次 |
[A-Q] | 代表大写字母A~Q,只出现一次 |
[0-7] | 代表数字0~7,只出现一次 |
模式匹配
模式匹配 | 代表意义 |
---|---|
(?:模式) | 与模式 匹配,但不保存匹配项;即不会存储匹配项以备将来之用。 这对于用“or”字符 (|) 组合模式部件的情况很有用。 |
(?=模式) | 正预测先行。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 |
(?!模式) | 负预测先行。 匹配与模式 不匹配的搜索字符串。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 |
优先级顺序
正则表达式的计算方式与算术表达式非常类似;即从左到右进行计算,并遵循优先级顺序。 下表按从高到低的顺序包含了正则表达式运算符的优先级顺序。
运算符 | 说明 |
---|---|
\ | 转义符 |
(), (?:), (?=), [] | 括号和中括号 |
*、+、?、{n}、{n,}、{n,m} | 限定符 |
^、$、\任何元字符 | 定位点和序列 |
| | 替换 |