一、正则表达式的起源:

            正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

            1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

            随后,Ken Thompson发现可以将这一工作应用于使用计算搜索,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。


二、什么是正则表达式


        百度百科解释为:

                正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

                正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。


                鸟哥Linux私房菜解释为:正规表达式就是处理字符串的方法,他是以行为单位来进行字符串的处理行为, 正规表达式透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序!


通俗解释:正则表达式就是通过一定的规则匹配获取文本中特定的内容的方法。


 正则表达式的分类:

            1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)

            2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)


名词解释:
	字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件


三、为什么要使用正则表达式


            当我们在时间有限的情况下要处理的非常多的文件,或者要处理非常大的文本文件时,通过正确使用正则表达式能让我们快速的检索到我们想要的文件或者文本信息,并可以把匹配的文件或文本信息打印出来,从而可以节省很多时间。

            此外,正规表达式对于系统管理员来说是很重要的!因为系统没填都会产生很多的信息,这些信息有的重要有的仅是告知, 此时,管理员可以透过正规表达式的功能来将重要讯息打印出来,并产生便于查阅的报表来简化管理流程。


三、如何正确使用正则表达式

            Linux处理正则表达式的主要程序是grep,本文将对其进行详细的讲解,以便读者可以更深一步的理解正则表达式的定义,并能在Linux系统中熟练的使用grep文本搜索工具。


3.1、什么是grep:

            grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式(正则表达元字符以及正常字符组合而成)搜索文本,并把匹配的行打印出来。


            Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。


        3.2、grep的使用:

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

      

     OPTIONS主要参数如下:	
         -o: only-matching 只显示被模式匹配到的内容
         -i: ignore case  不区分字符大小写
         -v: invert-match 显示不能够被模式匹配到的行
         -n: number 输出匹配行的同时在前面加上文件中的行数
         -c: count  输出匹配的数目(行数)
         -E: extended-regexp使用扩展的正则表达式 POSIX
         -A #:After的意思,显示匹配字符串后 # 行的数据
         -B #:before的意思,显示匹配字符串前 # 行的数据
         -C # 显示匹配字符串前后 # 行的数据
         --color=auto: 以特定颜色高亮显示匹配到的颜色

        --color=参数如下:
             auto
             always
             never

eg:

                (1)、以特定颜色显示匹配到的关键字:

                    wKioL1Ubq3qRiN62AAD-CZ1FDoQ724.jpg

                (2)、匹配/etc/passwd目录下含有root关键词的行

[root@1inux ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologi
[root@1inux ~]#

                (3)、将/etc/passwd文件中,有出现 root 的行取出来,同时显示这些行在/etc/passwd文件中的行号

wKiom1UbtjiSmPyfAACUhts4by4306.jpg

                (4)、显示/proc/meminfo文件中以大写或小写S开头的行,用两种方法:

wKiom1UbxN3gS38zAAEiZ4Y6V8w864.jpg

                (5)、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

wKiom1UbxXXh1e_BAACSrQHvVTk642.jpg


        3.3、基本正则表达式元字符:

                

字符匹配:
        . : 匹配任意单个字符
        []: 匹配指定范围内的任意单个字符
        [^] : 匹配指定范围外的任意单个字符
        [0-9],[[:digit:]]      所有数字;
        [^0-9],[^[:digit:]]    所有除数字外的任意字符
        [a-z],[[:lower:]]      所有的小写字母
        [A-Z], [[:upper:]]     所有的大写字母
        [[:space:]]            所有的空白字符
        [[:punct:]]            所有的标点符号
        [0-9a-zA-Z],[[:alnum:]]所有的字母和数字;
        [a-zA-Z],[[:alpha:]]    所有的字母
        * : 匹配左侧字符任意次,表示0次、1次或多次;
        .*:   任意长度的任意字符
                    工作与贪婪模式
        \?:0次或1次;表示其左侧字符可有可无
        \+: 1次或多次;匹配其左慈字符至少出现1次
        \{m\}: m次:表示其左侧字符精确出现m次
        \{m,n\}:至少m次,至多n次
        \{0,n\}:至多n次
        \{m,\}:至少m次

eg:创建grep.txt 文件,内容如下:                

wKiom1Ub2ELy9C8jAAA68vFwCHA512.jpg

. 匹配任意单个字符

wKiom1Ub2L3SsL0TAAAyV6y_pBA559.jpg

使用 .*  匹配任意长度字符

wKiom1Ub2V-zNMJ9AABFAYs_4SY084.jpg

匹配c前面至少出现3次b字符的行

wKiom1Ub2mninOq1AAAx5ITmoPI526.jpg



(1)、找出/etc/passwd文件中的一位数或两位数;

wKioL1Ubx6vw42UQAAGxjsQYhbc319.jpg

                (2)、找出/etc/passwd文件中的含有o连续出现两次的行

wKiom1UbygqDJwZeAAD1oDGPW_A545.jpg



位置锚定:用于搜索要搜索的PATTERN在行中所处的位置
        ^: 锚定行首
            ^TATTERN  //搜索以PATTERN开头的行
        $: 锚定行尾
            PATTERN$    //搜索以PATTERN结尾的行
			
        ^PATTERN$  //搜索匹配整行内容
		# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit
        ^$: 匹配空白行;

eg:

               (1)、搜索/etc/passwd 文件中以root为行首的行 

wKioL1UbvvrQI0WDAABxeHDtj9s312.jpg

               (2)、搜索/etc/passwd 文件中以bash为行尾的行                 

wKiom1Ubvs-jRG86AAEXVMyQf6M551.jpg

               (3)、搜索/etc/rc.d/rc.sysinit文件中以空白字符的行,并显示每行在文件中的行号

wKiom1UbwQfzZOW3AABaScqJiVs009.jpg



单词锚定:由非特殊字符组成的连续的字符串

        \< : 锚定词首,也可用\b
	    \<PATTERN, 或\bPATTERN
        \> : 锚定词尾,也可用\b
	    PATTERN\>, 或PATTERN\b
						
        \<PATTERN\>: 匹配PATTERN能匹配到的整个单词	

eg:

                (1)、搜索/etc/passwd 文件中以root为单词词首的行

wKiom1Ubusbim1HIAAETWESAw38315.jpg

                (2)、搜索/etc/passwd 文件中以nologin单词为词尾的行

wKiom1Ubu-GgnwB5AAIjYFRUD8s052.jpg

                (3)、搜索/etc/passwd 文件中包含单词shutdown的行

wKioL1UbvgTQxS2JAAD_zo0o5iw397.jpg



11

分组:\(\)
    注意:分组中的模式,在某次的具体匹配中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1,\2,...),因此,其匹配结果还可以被引用
\1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
\2: 引用,模式中自左而右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容;

eg:

                (1)、创建fenzu.txt 文件  其内容如下,查找第二个单词和第四个单词是一个单词的行

He like his lover.

He like his liker.

She love her lover.

She love her liker.

wKiom1Ubw7igoHTIAACILeHhmaU105.jpg



例:

1、使用echo命令输出一个绝对路径,使用grep取出其基名;

[root@1inux ~]# echo /etc/passwd/ | grep -o "[[:alnum:]]\+\/\?$"
passwd/
[root@1inux ~]# echo /etc/passwd | grep -o "[[:alnum:]]\+\/\?$"
passwd
[root@1inux ~]#

2、找出ifconfig命令结果中的1-255之间数字;

[root@1inux ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:49:03:2B  
          inet addr:192.168.67.129  Bcast:192.168.67.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe49:32b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX bytes:860103 (839.9 KiB)  TX bytes:510502 (498.5 KiB)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

3、写一个模式,能匹配合理的IP地址;

1.0.0.1 -- 239.255.255.255

grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"


4、将下面名字的姓后移,变成如下格式:

eg: 张三   变成 san.zhang 的格式

he shu peng 
liu zhi guo 
xu fei 
yang san zhao 
ren xiao li 
zhou shan 
xu sheng nan 
guo jing feng 
liu cong lin 
lei de bao 
liu xuan 
zhang peng cheng 
diao ming fei

使用vim完成的命令如下

: %s/\(^[a-z]*\)\(.*$\)/\2\.\1/g

然后可以在使用 以下命令去除空格

%s@[[:space:]]@@g