ahxcjxzxh 发表于 2018-8-30 10:02:28

Shell编程入门进阶之Grep命令及正则表达式知识梳理

二、正则表达式:  2.1 基本概念:
  正则表达使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。简而言之,正则表达式就是处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊符号的辅助,可以让用户轻松搜索/替换某特定的字符串。
  正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
  2.2 正则表达式详解介绍:
  2.2.1 基本的正则表达式:
  ◆(1)元字符:
.   → 点号,匹配任意单个字符如grep "r..t" /etc/passwd ,表示匹配r和t中间有两个任意字符的内容。
  [ ]   → 匹配指定范围内的任意单个字符
  如grep "" /etc/inittab ,表示匹配0到9中任意一个数字。

[^]   → 匹配指定范围外的任意单个字符如grep "[^0-9]" file ,表示出了数字,都匹配
  ◆(2)次数匹配:
注意:grep默认工作在贪婪模式下,即尽可能长的匹配*   → 匹配其前面的字符任意次.*   → 和*组合使用,表示匹配任意字符任意长度(包含0次)。  使用示例:
  如有文本a.txt包含内容如下:

  使用 grep "a*b" test1,匹配情况如下:

  使用 grep "a.*b" test1,匹配情况如下:

  其实就是a开头,b结尾的都被匹配上了。
  \?   → 匹配其前面的字符1次或0次
  使用grep "a\?b" a.txt ,匹配情况如下:

  注意跟 grep "a*b" test1的区别!!
  \{m\}→ 匹配其前面的字符m次
  \{m,\}→ 匹配其前面的字符至少m次
  \{m,n\}→ 匹配其前面的字符至少m次,至多n次
  \{0,n\}→ 匹配其前面的字符0至n次
  如:\{2,\}表示匹配至少2次:

  ◆(3)字符集和:
  [:digit:]→所有数字
  [:lower:]→所有小写字母
  [:upper:]→所有大写字母
[:punct:]→所有标点符号[:space:]→ 表示空格或tab键[:alpha:]→表示所有字母(包含大小写)   [:alnum:]→表示所有字母和数字
  如匹配/etc/resolv.conf中的所有数字:

  需要注意的是,这里需要用额外的[ ]将字符合集括起来。
  ◆(4)位置、字符锚定:
^ → 锚定行首,此字符后面的任意内容必须出现在行首  如查找/etc/passwd文件中以root开头的行:

$→ 锚定行尾,此字符前面的任意内容必须出现在行尾  如查找/etc/passwd中以bash结尾的行:

^$→ 空白行  如统计/etc/rc.d/rc.sysinit文件中有多少空白行:

\或\b→ 锚定词尾,其前面的任意字符必须作为单词的尾部出现  \或\b条件\b→ 查找某个独立的单词
  如查找/etc/passwd文件中以r开头,t结尾,中间包含两个任意字符的单词

  注意与grep "r..t" /etc/passwd结果的区别:

  如锚定一个精确指定的字符:

  ◆(5)分组:
\(ab\)→ 表示ab整体作为匹配字符\(ab\)* → 表示ab整体作为匹配字符,且匹配任意次\(ab\)\{1,\}→ 表示ab整体作为匹配字符,且匹配至少一次分组还可以后向引用\1→ 引用第一个左括号以及与之对应的右括号所包括的所有内容  \2→ 引用第二个左括号以及与之对应的右括号所包括的所有内容
  \3→ 引用第三个左括号以及与之对应的右括号所包括的所有内容
  如test2有文本内容如下:

  grep "\(l..e\).*\1r" test2 表示匹配结果如下:

  即引用的为前面匹配内容加上r,因此He like his lover这一行就不会被匹配。
2.2.2 扩展的正则表达式:  grep -E 表示支持扩展的正则表达式
  grep -E = egrep
  扩展的正则表达只是在基本的正则表达上作出了小小的一点修改,其修改如下:
  在扩展的正则表达中把\( \)写成()、\{ \}写成{ },另外加入了+:次数匹配,匹配其前面的字符至少出现一次,无上限、|: 或者(二取一),其余的都一样, 基本正则表达式,使用( ) { } . ?|都需要转义,在扩展正则表达中不需要加\,其详细信息如下:
  ◆(1)元字符:
  字符匹配的命令和用法与基本正则表达式的用法相同,这里不再重复阐述。
  ◆(2)次数匹配:
  上述字符匹配中,基本正则表达式与扩张表达式完全相同,但次数匹配就有些不一样了。
  * → 匹配前面字符任意次,与基本正则表达式意义相同
  ? → 匹配其前字符0次或1次,其前面不需要\ 转义
  + → 匹配其前字符至少一次,等于基本正则表达式的\{1, \}
  {m}→ 匹配其前面的字符m次,等于基本正则表达式的\{m\}
  {m,}→ 匹配其前面的字符至少m次,等于基本正则表达式的\{m,\}
  {m,n}→ 匹配其前面的字符至少m次,至多n次,等于基本正则表达式的\{m,n\}
  {0,n}→ 匹配其前面的字符0至n次,等于基本正则表达式的\{0,n\}   
  ◆(3)字符集和:
  字符集和基本正则与扩展正则通用,在此不在阐述。
  ◆(4)位置、字符锚定:
  用法和基本正则表达式的用法相同,在此不再阐述。
  ◆(5)分组:
  基本正则表达式中支持分组,而在扩展正则表达式中,分组的功能更加强大,也可以说才是真正的分组,用法如下:
(ab)→ 表示ab整体作为匹配字符,等于基本正则表达式的\(ab\)(ab)* → 表示ab整体作为匹配字符,且匹配任意次,等于基本正则表达式的\(ab\)*(ab){1,}→ 表示ab整体作为匹配字符,且匹配至少一次,等于基本正则表达式的\(ab\)\{1,\}分组还可以后向引用\1→ 引用第一个左括号以及与之对应的右括号所包括的所有内容  \2→ 引用第二个左括号以及与之对应的右括号所包括的所有内容
  \3→ 引用第三个左括号以及与之对应的右括号所包括的所有内容
  如egrep "(l..e).*\1r" test2 表示匹配结果如下:

  除了方便后面引用外,分组还非常方便的可以使用上述次数匹配方法进行匹配具有相同条件的数据。
  如:egrep '^(halt).*\1' /etc/passwd 搜索/etc/passwd中以halt开头,而后面还存在halt的行

  ◆(6)或者:
  |→ 表示或,如
  a|b 表示匹配a或者b
  B|bike 匹配B或bike,即 | 匹配的是其整个左边或者右边

  (B|b)ike 匹配Bike或者bike,注意与上一行的区别

  三、grep,egrep应用小示例:
  3.1 显示~/.bashrc 中以#开头,且后面跟一个或者多个空白符,而后又跟了任意非空白符的行;

  3.2 显示/proc/meminfo文件中以大小写s开头的行;

  或者:

  3.3 取出默认shell为非bash的用户;

  3.4 取出默认shell为bash的且其ID号最大的用户;

  3.5 找出/etc/passwd文件中一位数或两位数;

  3.6 找出ifconfig命令结果中的1到255之间的整数;

  3.7 查看当前系统上root用户的所有信息;

  3.8 添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

  3.9 写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)

  Ps:如果本文章对你学习有所帮助,那将是我最大的荣幸;
  若文章中出现任何问题,烦请指出或联系我(QQ:2399447849)
  Thanks!
  

页: [1]
查看完整版本: Shell编程入门进阶之Grep命令及正则表达式知识梳理