文章目录
1.正则表达式概述
1.1 正则表达式的定义
- 正则表达式又称正规表达式、常规表达式,是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
- 正则表达式是由普通字符与元字符组成的文字模式。
正则表达式组成
- 普通字符:大小写字母、数字、标点符号及一些其他符号;
- 元字符:在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在自标对象中的出现模式。
正则表达式用途
- 正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
1.2 正则表达式的分类
- 正则表达式分为基础表达式与扩展正则表达式,它不是一个工具程序,而是一个字符串处理的标准依据,是使用单个字符串搜索、匹配一系列符合某个语法规则的字符串。
- 基础正则表达式是常用正则表达式最基础的部分。在 Linux系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,egrep 与 awk 支持扩展正则表达式。
如果要以正则表达式的方式处理 字符串,就得使用支持正则表示得工具,如下表:
文本处理工具 | 基础正则表达式 | 扩展正则表达式 |
---|---|---|
vi编辑器 | 支持 | |
grep | 支持 | |
egrep | 支持 | 支持 |
sed | 支持 | |
awk | 支持 | 支持 |
1.2.1 基础正则表达式
基础正则表达式是常用的正则表达式部分,除了普通字符外,常见到以下元字符:
元字符 | 作用 |
---|---|
\ | 转义字符,用于取消特殊符号的含义,如:\ !、\ n等 |
^ | 匹配字符串开始的位置,例: ^world 匹配以 world 开头的行 |
$ | 匹配字符串结束的位置,例: world$ 匹配以 world 结尾的行 |
. | 匹配除\n(换行)之外的任意的一个字符,例:go.d、g…d |
* | 匹配前面子表达式0次或者多次 |
[list] | 匹配 list 列表中的一个字符,如:[0-9]匹配任意一位数字 |
[^list] | 匹配任意不在 list 列表中的一个字符,如:[^0-9]匹配任意一位非数字字符 |
\ { n\ } | 匹配前面的子表达式n次,如[0-9]\ [2\ ]匹配两位数字 |
\ { n,\ } | 匹配前面的子表达式不少于n次,如:[0-9]\ [2,\ ]表示两位及两位以上的数字 |
\ { n,m\ } | 匹配前面的子表达式n到m次,如:[a-z]\ [2,3\ ]匹配两到三位的小写字母 |
1.2.2 扩展正则表达式
扩展正则表达式是对基础正则表达式的扩充和深化,下表列出了常用的扩展元字符及作用:
元字符 | 作用 |
---|---|
+ | 匹配前面的子表达式1次以上,如:go+d,将匹配至少一个 |
? | 匹配前面的子表达式0次或者1次,如:go?d,将匹配gd或god |
() | 将()号中的字符串作为一个整体,如:(xyz)+,将匹配xyz整体1次以上 |
I | 以或的方式匹配字符串 |
下面以egrp工具,/etc/passwd文件为例,介绍扩展正则表达式:
[root@localhost ~]# egrp 0+/ etc/passwd //匹配至少一个0的行
[root@localhost ~]# egrp '(root|ntp)' /etc/passwd //匹配包含root或ntp的行
[root@localhost ~]# egrp ro?t /etc/passwd //匹配rt或rot的行
[root@localhost ~]# egrp -v '^$|^#' /etc/passwd //过滤文件中的空白行和#开头的行
//不显示则表示没有空白行与#开头的行
2.Sed工具概述
- sed (Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。
sed的工作流程主要包括读取、执行和显示三个过程:
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,patternspace) ;
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed命令将会在所有的行上依次执行;
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意
默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
2.1 sed命令常见用法
sed [选项] ’操作’ 参数
sed [选项] -f scriptfile 参数
常见的sed命令选项主要包含以下几种
- -e script:指定sed编辑命令,只有一个编辑命令时可以省略;
- -f scriptfile:指定的文件中是sed编辑命令;
- -h或–help:显示帮助;
- -n、 --quiet或silent:表示仅显示处理后的结果,即只输出处理后的行,读入时不显示;
- i:直接编辑文本文件,而不输出结果。
常见的操作包括以下几种:
- a:增加,在当前行下面增加一行指定内容;
- c:替换,将选定行替换为指定内容;
- d:删除,删除选定的行;
- i:插入,在选定行上面插入一行指定内容;
- p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。
- s:替换,替换指定字符;
- y:字符转换;
- w:保存为文件;
- r:读取指定文件。
2.2 sed用法示例
2.2.1 输出指定的行
[root@localhost ~]# sed -n 'p' /etc/passwd //将所有内容输出
[root@localhost ~]# sed -n '6p' /etc/passwd //将第六行内容输出
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost ~]# sed -n '6,8p' /etc/passwd //输出第6到8行内容
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# sed -n 'p;n' /etc/passwd //将所有奇数行输出
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...... //省略部分内容
[root@localhost ~]# sed -n 'n;p' /etc/passwd //将所有偶数行输出
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
...... //省略部分内容
[root@localhost ~]# sed -n '1,10{p;n}' /etc/passwd //将1-10行的奇数行输出
[root@localhost ~]# sed -n '1,10{n;p}' /etc/passwd //将1-10行的偶数行输出
[root@localhost ~]# sed -n '10,${p;n}' /etc/passwd //将第10行到末尾之间的奇数行输出
[root@localhost ~]# sed -n '$p' /etc/passwd //将最后一行输出
[root@localhost ~]# sed -n '1,+3p' /etc/passwd //将第1行开始,连续3行进行输出(1-4行)
[root@localhost ~]# sed -n '/root/p' /etc/passwd //将匹配包含root的行输出
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '10,/nom/p' /etc/passwd //将第10行至第一个包含nom的行进行输出
[root@localhost ~]# sed -n '/root\|ntp/p' /etc/passwd //输出包含root或ntp的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@localhost ~]# sed -n '/nom/=' /etc/passwd //将包含nom所在的行行号输出
37
[root@localhost ~]# sed -e '5q' /etc/passwd //输出前五行信息后退出,q退出
2.2.2 插入符合条件的行
[root@localhost ~]# sed '/root/i yg:x:500:500:YG:/home/yg:/bin/bash' /etc/passwd
//在root前添加一行 yg:x:500:500:YG:/home/yg:/bin/bash
yg:x:500:500:YG:/home/yg:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...... //省略部分信息
[root@localhost ~]# sed '/root/a yg:x:500:500:YG:/home/yg:/bin/bash' /etc/passwd
//在root的下一行添加yg,a表示在当前行的后面一行添加
[root@localhost ~]# sed '3aAA' /etc/passwd //在第3行之后插入AA
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
AA
注意:在使用插入时,如果添加多行数据,除最后一行外,每行末尾都需用“\n”符号表示数据未完结,换行。
2.2.3 删除符合要求的行
[root@localhost ~]# sed '1d' /etc/passwd //删除第1行
[root@localhost ~]# sed '$d' /etc/passwd //删除最后1行
[root@localhost ~]# sed '^$' /etc/passwd //删除所有空行
[root@localhost ~]# sed '1,3d' /etc/passwd //删除1-3行
[root@localhost ~]# sed '/root/d' /etc/passwd //删除含义root的行
[root@localhost ~]# sed '/root/!d' /etc/passwd //删除不包含root的行,!表示取反
[root@localhost ~]# sed '/^root/d' /etc/passwd //删除以root开头的行
[root@localhost ~]# sed '/nologin/$d' /etc/passwd //删除以nologin结尾的行
2.2.4 替换符合条件的文本
[root@localhost ~]# sed 's/root//g' /etc/passwd //将文件中的所有root都删除
:x:0:0::/:/bin/bash
...... //省略部分信息
[root@localhost ~]# sed -n 's/root/admin/2p' /etc/passwd //把每行的第2个root替换成admin
root:x:0:0:admin:/root:/bin/bash
[root@localhost ~]# sed '/root/s/root/ROOT/g' /etc/passwd //将包含root的行中所有的root替换成ROOT
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
...... //省略部分信息
[root@localhost ~]# sed 'y/root/ROOT/' /etc/passwd //将root对应替换为ROOT,y表示替换
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
...... //省略部分信息
[root@localhost ~]# sed 's/r/R/' /etc/passwd //将每行中的第1个r替换成R
Root:x:0:0:root:/root:/bin/bash
...... //省略部分信息
[root@localhost ~]# sed 's/r/R/2' /etc/passwd //将每行中的第2个r替换成R
root:x:0:0:Root:/root:/bin/bash
...... //省略部分信息
[root@localhost ~]# sed '1cKEEP' /etc/passwd //将第1行替换成KEEP
KEEP
...... //省略部分信息
[root@localhost ~]# sed 's/^/#/' /etc/passwd //在每行行首插入#号
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
...... //省略部分信息
[root@localhost ~]# sed 's/$/EOF/' /etc/passwd //在每行行尾插入EOF
root:x:0:0:root:/root:/bin/bashEOF
bin:x:1:1:bin:/bin:/sbin/nologinEOF
...... //省略部分信息
2.2.5 迁移符合条件的文本
[root@localhost ~]# sed '/root/w file1' /etc/passwd //将包含root的行另存为文件file1
[root@localhost ~]# sed '/root/{H;d};$G' /etc/passwd //将包含root的行迁移至末尾
[root@localhost ~]# sed '1,5{H;d};$G' /etc/passwd //将1-5行内容迁移至末尾
其中h表示保存当前模式到一个缓冲区,G表示取出保存的模式。
2.2.6 直接修改文件内容
[root@localhost ~]# sed -i 's/^/#/' /etc/passwd //在每行开头插入#号,直接修改文件
[root@localhost ~]# sed -i 's/^#//g' /etc/passwd //将每行开头的#号删除,直接修改文件
[root@localhost ~]# sed -i '2s/^#//g' /etc/passwd //将第二行开头的#号删除,直接修改文件
[root@localhost ~]# sed -i 's/a/A/2' /etc/passwd //将每一行的第二个a修改为A
[root@localhost ~]# sed -i 'y/root/ROOT/' /etc/passwd //将每一行的root对应替换为ROOT,y表示替换
[root@localhost ~]# sed -i '2y/root/ROOT/' /etc/passwd //将第二行的root对应替换为ROOT
注意:在该模式下,单个s表示对每一行进行操作,2s表示对第二行进行操作,依次类推;g可以省略不写
扩展:
- -e可以将多个命令连接起来,也可以将多个编辑器命令保存到文件中,通过-f指定文件,已完成多个处理操作。
[root@localhost ~]# sed -ne 's/root/admin/' -ne 's/bash/sh/p' /etc/passwd //将root和bash行作替换
admin:x:0:0:root:/root:/bin/sh
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/sh
yjj:x:1000:1000:YJJ:/home/yjj:/bin/sh