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,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
正则表达式共分两类即:基本正则表达式(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:]] 输出标点 次数匹配,用于要指定其次数的字符的后面 *:任意次 \?:前面的字符出现0或1次 \+ 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 高亮 [[email protected] ~]# 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结尾的行
|
示例2 显示/etc/passwd文件中的两位数或三位数
cat /etc/passwd | grep "\<[0-9]\{2,3\}\>" |
示例3 显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
[[email protected] ~]# 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 添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
[[email protected] ~]# useradd bash [[email protected] ~]# useradd testbash [[email protected] ~]# useradd basher [[email protected] ~]# useradd -s /sbin/nologin nologin [[email protected] ~]# 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 显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
[[email protected] ~]# 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 [[email protected] ~]# 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文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行.
第一种 次单词为英文单词 只有字母和包含题目所说的下划线 第二种 单词包含任意 字母 数字 下划线 但首部及尾部不能出现下划线 |
示例 7 使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名
找出路径目录名 找出路径基名 |
示例 8 找出ifconfig命令执行结果中1-255之间的数字
|