正则表达式的定义与用法,sed工具的介绍与应用

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值