1    前言

本文档主要介绍正则表达式的含义及其常用命令使用方法,并提供相应案例解释其含义。

学习这些正则表达式是一个Linux爱好者需要具备的首要条件,让小编带领你们进入Linux的世界看看它的一颦一笑。

读者对象

本文档(本指南)主要适用于以下人员:

Linux爱好者

2     环境简介

项目

配置

硬件型号

Tinkpad T440P

CPU

I5-4210

内存

4G

操作系统

Windows 8.1

虚拟系统

Vmware workstation 11

CPU

1Core

内存

1G

操作系统

Centos 7.1

 

3     概述

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regexregexpRE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

正则表达式共分两类即:基本正则表达式(BRE)和扩展正则表达式(ERE)。大多数LINUX程序至少要符合BRE规范。

4     正则表达式

正则表达式是由元字符及正常字符书写的模式,其中的元字符不表示字符本身的意义,而是执行表达式控制或通配等功能。

模式:由正则表达是的元字符及文本字符所编写的过滤条件。

4.1   元字符

元字符是一个或一组代替一个或多个字符的字符。听起来有点拗口,但举一个例子也许你就明白了:元字符*用来匹配0个或多个的前一字符;而元字符 . 用来匹配一个任意的一个字符。

正则表达式元字符

字符匹配:

任意单个字符

匹配其前面的字符任意次;

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

\?  匹配其左侧0次或1

\+  其左侧字符至少出现1

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

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

[0-9],= [[:digit:]]

[a-z]= [[:lower:]]

[A-Z],=[[:upper:]]

[a-z,A-Z]=[[:alpha:]]

[[a-z,A-Z,0-9]]=[[:alnum:]]

[“ ”]=[[:space:]] 输出空白字符

[[:punct:]]   输出标点

次数匹配,用于要指定其次数的字符的后面

*:任意次

\?:前面的字符出现01

\+ 1或多次:

\{m\} 精确限制为m

\{m,n\}: 至少m次,至多n

\{0,n\} 至多N

\{M,\} 至少M

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

位置锚定

^ 行首锚定: 用于模式的最左侧

$: 行尾锚定:用于模式的最右边

\<\b词首锚定:用于表示单词的模式的左侧:

\> ,\b词尾锚定:用于表示单词的模式的右侧

^$:空白行

单词锚定

\<锚定词首 指定单词首部为某个指定匹配字符

\>锚定 词尾

\<pattern\>

分组牟定

\(\) \(pattern\)pattern 能够把多个字符捆绑到一起做一个字符表示

分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中:这个鞋变量非标时\1,\2...

\1:从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容:

\2:  引用模式中自左到右,由第二个左括号以及与之对应的右括号中的模式所匹配的内容

...后向引用:引用前面的分组括号中的模式所匹配的字符:、

 

扩展表达式元字符(列出与正则表达是不同的

       出现了0次或1 正则表达式为\?
{m,n}       
匹配前边字符最少m次,最多n
()           
分组,用法与grep类似
a|b          
二选一

 

4.2   基本正则表达式及命令

grep:global search REgular expression adn print out the line.作用:文本搜索工具,根据用户指定的模式逐行去搜索目标文本显示匹配的行

 

选项

--color=auto  高亮

 [root@localhost ~]# grep 'root' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

-v :显示模式匹配不到的行

-i 忽略大小写

-o 仅显示能够被模式匹配到的串本身

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

 示例1 显示/etc/passwd文件中以bash结尾的行

image

 示例2 显示/etc/passwd文件中的两位数或三位数

cat /etc/passwd | grep "\<[0-9]\{2,3\}\>"

image

 示例3 显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

[root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$"

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN    

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN    

tcp6       0      0 :::22                   :::*                    LISTEN    

tcp6       0      0 ::1:631                 :::*                    LISTEN    

tcp6       0      0 ::1:25                  :::*                    LISTEN

 示例4 添加用户bashtestbashbasher以及nologin用户(nologin用户的shell/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

[root@localhost ~]# useradd bash

[root@localhost ~]# useradd testbash

 [root@localhost ~]# useradd basher

[root@localhost ~]# useradd -s /sbin/nologin nologin

[root@localhost ~]# cat /etc/passwd | grep "^\(\<.\+\>\).*\1$"

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

bash:x:1004:1004::/home/bash:/bin/bash

nologin:x:1008:1008::/home/nologin:/sbin/nologin

 

4.3   扩展正则表达式及命令

 示例 5 显示当前系统上rootcentos或者user1用户的默认shellUID (请事先创建这些用户,若不存在)

[root@localhost ~]# egrep "^\<root\>|^\<centos\>|^\<user1\>" /etc/passwd

root:x:0:0:root:/root:/bin/bash

centos:x:1009:1009::/home/centos:/bin/bash

user1:x:1010:1010::/home/user1:/bin/bash

[root@localhost ~]# egrep "^\<root\>|^\<centos\>|^\<user1\>" /etc/passwd |cut -d ':' -f 3,7

0:/bin/bash

1009:/bin/bash

1010:/bin/bash

 示例 6 找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行. 

第一种 次单词为英文单词 只有字母和包含题目所说的下划线

image

第二种 单词包含任意 字母 数字 下划线 但首部及尾部不能出现下划线

image



 示例 7 使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

找出路径目录名

image

找出路径基名

image

示例 8 找出ifconfig命令执行结果中1-255之间的数字

image