linux下文件查看技巧

"2-了解正则表达式"

Posted by Dunno on May 9, 2016

目录

背景

在工作中我们经常需要查看日志来迅速的定位问题,同时发生故障时我们要经常的统计日志中相关的内容,那么掌握一些常用的日志操作命令就非常必要了。

之前介绍了查看文件过程中经常使用到的命令,但是我们在某些精细化的场景中也不能满足要求,比如单扣出某个字符,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}限定符
^、$、\任何元字符定位点和序列
|替换