【shell】正则表达式

希望各位不要白piao,点个赞或者刷个评论再走,还有【禁止转载】,抄袭转载必究,谢谢合作。

本篇文章主要讲了shell中的正则表达式的用法,如果不懂正则在其他命令中的使用,请在我的博文里面搜索你要的命令,我都有讲。如果会了可以忽略本文章,省下时间去学习别的知识~如果你已经知道了正则相关知识,想知道shell怎么进行简单的数据处理请移步shell三大常用数据处理命令的博文:
grep实战指南
awk实战指南
sed实战指南
----------------------文章概述----------------------

  1. 如何看文档
  2. 常见符号解释
  3. 数量限定符
  4. 位置限定符
  5. 其他特殊字符

--------------------------------------------------------
至于正则表达式是什么,我就不多说了,如果真的有这个都不知道的我觉得你应该先去百度一下再来论坛看文章。我们直接说正则表达式的语法

如何看文档

这里我再说一下如果你不知道命令的具体用法怎么办,你首先想到的一定是通过man 你要查询的命令 去看文档。如果你想在这条路上走的远,你就得有文档阅读能力,这是必须要有的能力,英文看不懂?学。程序员不需要学习,机械工作就好。程序工程师可不是机械的工作,你要改变世界的,奥利给~~~~

常见符号解释

匹配符 含义
. 匹配任意一个字符 abc.可以匹配abcd、abc9等
[ ] 匹配括号中的任意一个字符 [abc]d可以匹配ad、bd或cd
- 在[ ]括号内表示字符范围 [0-9a-fA-F]可以匹配一位十六进制数字
^ 位于[ ]括号内的开头,匹配除括号中的字符之外的任意一个字符 [^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1、b1但不匹配x1、y1
[ [ :xxx: ] ] grep工具预定义的一些命名字符类 [ [ :alpha: ] ]匹配一个字母,[ [ :digit: ] ]匹配一个数字

数量限定符

常用的有以下几种:

  1. ? 紧跟在它前面的单元应匹配零次或一次[0-9]?\.[0-9]匹配0.0、2.3、.5等,由于.在正则表达式中是一个特殊字符,所以需要用\转义一下
  2. 取字面值+ 紧跟在它前面的单元应匹配一次或多次[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+匹配email地址
  3. * 紧跟在它前面的单元应匹配零次或多次[0-9][0-9]*匹配至少一位数字,等价于[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*
  4. {N} 紧跟在它前面的单元应精确匹配N次 [1-9][0-9]{2}匹配从100到999的整数
  5. {N,} 紧跟在它前面的单元应匹配至少N次 (这跟第4条是不一样的这里多个号)[1-9][0-9]{2,}匹配三位以上(含三位)的整数
  6. {,M} 紧跟在它前面的单元应匹配最多M次 [0-9]{,1}相当于[0-9]?
  7. {N,M} 紧跟在它前面的单元应匹配至少N次,最多M次 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}匹配IP地址 (这个地方其实有个坑这个是有的意思 不是有且只有,这个地方很重要,我自己就被坑过)

再次注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。再举个例子,如果文本文件的内容是

aaabc
aad
efg

查找a*这个模式的结果是三行都被找出来了

egrep 'a*' testfile 

运行结果为:
aabc
aad
efg
a匹配0个或多个a,而第三行包含0个a,所以也包含了这一模式。单独用a这样的正则表达式做查找没什么意义,一般是把a*作为正则表达式的一部分来用。* 紧跟在它前面的单元应匹配零次或多次)

位置限定符

字符  含义                举例
^   匹配行首的位置        ^Content匹配位于一行开头的Content
$   匹配行末的位置        ;$匹配位于一行结尾的;号,^$匹配空行
\<  匹配单词开头的位置    \<th匹配... this,但不匹配ethernet、tenth
\>  匹配单词结尾的位置    p\>匹配leap ...,但不匹配parent、sleepy
\b  匹配单词开头或结尾的位置     \bat\b匹配... at ...,但不匹配cat、atexit、batch
\B  匹配非单词开头和结尾的位置   \Bat\B匹配battery,但不匹配... attend、hat ...

位置限定符可以帮助grep更准确地查找
【Case1】:用[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}查找IP地址

运行结果如下:
192.168.1.1
1234.234.04.5678
【Case2】:\^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$查找
运行结果为:
1234.234.04.5678这一行过滤掉了。因为有了``$`符号

其它特殊字符

字符 含义 举例
\ 转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符 普通字符<写成<表示单词开头的位置,特殊字符.写成.以及\写成\就当作普通字符来匹配
() 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 ([0-9]{1,3}.){3}[0-9]{1,3}匹配IP地址
| 连接两个子表达式,表示或的关系 n(o either)匹配no或neither

以上介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符?+{}|()应解释为普通字符,要表示上述特殊含义则需要加\转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic规范来写正则表达式。

如果是上面的这段话理解不了不用理解了,反正你在工作的时候egrep不好用就直接使用grep -E对吧,有些东西我们需要较真有些东西真没必要,对于无关事务的过于较真就叫杠精

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章