Linux基础知识之文本查找和正则表达式扩展正则表达式

1.什么是正则表达式?

     正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的复制,让用户可以轻易达到查找、删除、替换某些特定字符串的处理程序。

     正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工作程序就可以用来作为正则表达式的字符串处理之用。支持正则表达式的工具一般有grep、sed、awk、vi/vim等工具。

 2.正则表达式和通配符有什么区别?

     通配符代表的是bash操接口的一个功能,通配符多用在文件名上,比如查找find,ls,cp等。

     正则表达式则是一种字符串处理的表示方式,正则表达式用在文本过滤工具里,比如grep,awk,sed等。

 3.正则表达式的分类?

     正则表达式的字符串按照表示方式依照不同的严谨度而分为基础正则表达式和扩展正则表达式。

 4.使用正则表达式需要特别注意的点?

     使用正则表达式时,需要特别留意当时环境的语系为何,否则可能会发现结果可能和别人的不相同。echo $LANG:查看所处环境的语系。

     grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取。

 5.基本正则表达式符号代表的含义:

     特殊符号      代表的含义

[:alnum:]       所有的数字和字母,0-9,a-z,A-Z

[:alpha:]       所有的字母,a-z,A-Z

[:space:]       所有的空白字符,空格和TAB

[:digit:]       所有的数字,0-9

[:punct:]       所有的标点符号

[:lower:]       所有的小写字母,a-z

[:upper:]       所有的大写字母,A-Z

 6.grep命令的基本用法:

      grep:根据模式,搜索文本,并将符合模式的文本行显示出来。

      Pattern:由文本字符和正则表达式的元字符组合而成匹配条件

      grep [OPTIONS] PATTERN [FILE…]

          -i:表示忽略大小写

          –color:把查找到的字符,用颜色标识出来

          -v:反向查找,显示没有被模式匹配到的行,匹配到的不显示

          -o:只显示被模式匹配到的字符串

          -E: 使用扩展正则表达式

          -A #:显示查找的文件的后#行,用–分开

          -B #:显示查找的文件的前#行,用–分开

          -C #:显示查找文件的前后各#行,用–分开

 7.正则表达式:Regular EXPression :REGEXP

      元字符:默认方式工作在贪婪模式下

          .:表示匹配任意长度的任意字符

          []:匹配指定范围内的任意单个字符

          [^]:匹配指定范围外的任意单个字符

          ^[^]:^在[]的内外是由区别的,[^]表示的是反向选择,^[]表示定位在行首的含义。

      字符的匹配次数(贪婪模式):尽可能长的去匹配,有部分匹配也行

          *:匹配其前面的字符任意次

            eg:a,b,ab,aab,acb,adb,amnb

            a*b:可以匹配的是:b,ab,aab(a出现任意次后面跟个b)

            a.*b:可以匹配的是:ab,aab,acb,adb,amnb(a开头b结束的任意长度的任意字符)

            a\?b:b,ab(上面是全部符合的,剩下的有一部分是符合的)

            .*:匹配任意长度的任意字符

            \?:匹配其前面的字符1次或0次

            \{m,n\}:匹配器前面的字符至少是m次,至多是n次

            a\{1,3\}b:可以匹配:ab,aab,只能匹配两个条件都符合的

            a.\{1,3\}b:可以匹配:aab,acb,adb,amnb(a和b中间的可以是一个两个或者三个)

         位置锚定

            ^:锚定行首(此字符后面的任意字符段必须出现在行首)

             eg: grep '^root' /etc/passwd

                 表示在下面查找的内容中,root必须是在行首出现

            $:锚定行尾(此字符前面的任意字符段必须出现在行尾)

             eg: grep 'root$' /etc/passwd

                 表示在下面查找的内容中,root必须是在行尾出现

            ^$:空白行

            \<或\b:锚定行首,其后面的任意字符必须作为单词首部出现

            \>或\b:锚定行尾,其后面的任意字符必须作为单词尾部出现

            \<root\>:整个的单词出现

          分组:

         \(\)

               \(ab\)*:ab可以出现一次两次,任意次,修饰的是ab这个整体

          后向引用

              \1:引用第一个左括号以及与之对应的右括号所包括的所有内容

              \(l..e\).*\1:后面查找的内容,必须和前面的内容一样

     扩展的正则表达式:工作在贪婪模式中

     扩展正则表达式的花括号不用使用反斜线

         字符匹配:

              ?:任意单个字符

              []:指定范围内的单个字符

              [^]:指定范围外的单个字符

         次数匹配:

              *:匹配其前面的字符任意次

              ?: 匹配其前面的字符1次或0次

              +:匹配其前字符至少1次

              {m,n}:匹配器前面的字符至少是m次,至多是n次

         分组:不需要加反斜线

              ():分组,真正的实现分组

              \1,\2,\3,…

         或者:  |   or

              a|b:ab有一个就行啊

              C|cat:只匹配单纯的C|cat。

          grep -E=egrep 用于扩展正则表达式的grep

          锚定的数字,必须是单个的字符出现,小数点不会被识别

 查找文件的基本演示:

     a.正则表达式:

     1.查找特定的字符串:(使用-n选项,默认显示查找到的行的行号)

          正向查找grep -n 'root' /etc/passwd

         blob.png

          反向查找grep -vn 'root' /etc/passwd  (除了含有root的两个没匹配,其余都匹配)

         blob.png

          查找的字符不区分大小写 grep -in 'Root' /etc/passwd

         blob.png

     2.查找以特定字符开头的字符串:

          grep -n '^root' /etc/passwd :查找以root开头的字符串

         blob.png

     3.利用[]来查找集合字符

          grep -n 'r[oa]ot' /etc/passwd :[]中无论几个字符,都是代表一个字符,相当于查询root raot

         blob.png

     4.利用[]来查找连续字符的内容

          grep ':[0-9]:' /etc/passwd : []中出现的范围的单个字符

         blob.png

     5.利用[^]来过来我们不想查找的内容

          grep -n 'r[^o]ot' /etc/passwd :[^]不会去查找[^]中的内容

         blob.png

     6.利用特殊符号来查找内容

          grep -n '^[^[:lower:]].' /etc/passwd :查找/etc/passwd 下面以非小写字母开头的字符

         blob.png

          grep -n '^[[:digit:]].' /etc/passwd :查找/etc/passwd 下面以数字开头的字符

         blob.png

     7.查找以特定字符结尾的字符串

          grep -n 'bash$' /etc/passwd :查找以bash结尾的字符串

         blob.png

     8.表示任意一个字符 .(表示一定有一个任意字符的意思)

          grep -n 'r..t' /etc/passwd :表示查找到的字符中是以r开头以t结尾,中间含有两个字符,但不指定中间这两个字符是什么

         blob.png

     9.表示重复字符*(表示*前面的字符可以重复0次到无穷次)

          grep -n 'ooo*' /etc/passwd :表示查找到的字符中最少含有oo,可以含有2-n个o字符

         blob.png

     10.表示以特定字符开头以特定字符结尾,中间含有任意个字符,为.*

          grep -n 'r.*t' /etc/passwd :表示r和o中间可以有很多个字符,不限定是什么

         blob.png

     11.表示限定连续多个字符范围 {}  (使用中{}需要转义为\{\})

          grep -n 'o\{2\}' /etc/passwd :表示查找的字符中含有仅含有两个o

         blob.png

          grep -n 'o\{1,3\}' /etc/passwd :表示查找的字符中含有1-3个o

         blob.png

      需要转义符特殊制定的符号:

          .–>\.   {}–>\{\}

     b.扩展正则表达式:需使用grep -E 或者egrep 跟后面的正则表达式

     1.表示查找一个以上的字符 +

          egrep 'ro+t' /etc/passwd :查找文件中以ro+t的字符,o出现一次或者n次

         blob.png

     2.表示前面出现零个或者一个前面的字符

          egrep 'roo?t' /etc/passwd :查找文件中以roo?t的字符,第二个o出现一次或者零次 查找的结果为 rot root 

         blob.png

     3.表示用或的方式找出数个字符串

          egrep 'raot|root|rot' /etc/passwd :查找文件中的raot|root|rot字符

         blob.png

     4.查找“组”字符串

          egrep 'r(a|o)ot' /etc/passwd :查找文件中root或raot 字符

         blob.png

     5.查找多个重复组的判别 ()+

          egrep 'r(ao)+t' /etc/passwd :查找文件中含有多个ao的字符

         blob.png

原创文章,作者:sjsir,如若转载,请注明出处:http://www.178linux.com/31290