shell正则表达式、sed基本用法及sed应用案例

一、正则表达式

可以使用若干符号配合某工具对字符串进行增删改查操作

1.1 基本正则列表

正则符号

描述

^

匹配行首

$

匹配行尾

[ ]

集合,匹配集合中任意单个字符

[ ^ ]

对集合取反

.

匹配任意字符

*

匹配前一个字符任意次数【*不允许单独使用】

\{n,m}

匹配前一个字符n到m次

\{n\}

匹配前一个字符n次

\{n,\}

匹配前一个字符n次以上

\(\)保留
^$空行

1.2 运用案列 

1.2.1 准备素材 

[root@test1 ~]# head -5 /etc/passwd > user  #准备素材

1.2.2 单符号匹配
[root@test1 ~]# grep ^root user    #找以root开头的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep bash$ user     #找以bash结尾的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep ^$ user   #找空行


[root@test1 ~]# grep -v ^$ user  #显示除了空行的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 1.2.3 集合符号运用
[root@test1 ~]# grep "[root]" user    #找r、o、t任意一个字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[rot]" user    #效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^rot]" user   #显示r或o或t以外的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[0123456789]" user   #找所有数字
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[0-9]" user    #效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^0-9]" user   #显示数字以外内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[a-z]" user    #找所有小写字母
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[a-Z]" user    #找所有字母
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "[^0-9a-Z]" user   #找所有符号
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.2.4 任意字符运用
[root@test1 ~]# grep "." user   #找任意单个字符,文档中每个字符都可以理解为任意字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@test1 ~]# grep "r..t" user  #找rt之间有2个任意字符的行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep "r.t" user  #找rt之间有1个任意字符的行,没有匹配内容,就无输出


[root@test1 ~]# grep "*" user   #错误用法,*号是匹配前一个字符任意次,不能单独使用


[root@test1 ~]# grep "ro*t" user   #找rt,中间的o有没有都行,有几次都行
root:x:0:0:root:/root:/bin/bash


[root@test1 ~]# grep ".*" user  #找任意,包括空行 .与*的组合在正则中相当于通配符的效果
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.2.5 字符个数匹配
[root@test1 ~]# grep "ro\{1,2\}t" user  #找rt,中间的o可以有1~2个
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{2,6\}t" user  #找rt,中间的o可以有2~6个
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{1,\}t" user  #找rt,中间的o可以有1个以及1个以上
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "ro\{3\}t" user   #找rt,中间的o必须只有有3个

1.3 扩展正则列表

正则符号

描述

+

最少匹配一次

最多匹配一次

{n,m}

匹配n到m次

()

组合为整数,保留

|

或者

\b

单词边界

提示:1.2案例的命令以上命令均可以加-E选项并且去掉所有\,改成扩展正则的用法,比如grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user或者egrep "ro{1,}t" user

1.4 案列运用

1.4.1 扩展正则符号使用
[root@test1 ~]# grep "ro\{1,\}t" user   #使用基本正则找o出现1次以及1次以上
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "ro{1,}t" user   #使用扩展正则,效果同上,比较精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "ro+t" user   #使用扩展正则,效果同上,最精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# grep "roo\{0,1\}t" user   #使用基本正则找第二个o出现0~1次
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "roo{0,1}t" user   #使用扩展正则,效果同上,比较精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "roo?t" user   #使用扩展正则,效果同上,最精简
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "(0:){2}" user  #找连续的2个0:  小括号的作用是将字符组合为一个整体
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# egrep "root|bin" user  #找有root或者bin的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

二、sed 流式编辑器

可以对文档进行非交互式增删改查,逐行处理。

2.1 用法:

●前置指令 | sed  选项  条件  指令

●sed  选项  条件  指令  被处理文档

选项

符号

含义

-n

屏蔽默认输出

-r

支持扩展正则

-i

修改源文件

指令

符号

含义

p

输出

d

删除

s

   替换  

 2.2 语法演示

[root@test1 ~]# sed -n  'p'  user    #输出所有行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n  '1p'  user   #输出第1行
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -n  '2p'  user   #输出第2行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@test1 ~]# sed -n  '3p'  user    #输出第3行
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@test1 ~]# sed -n  '2,4p'  user   #输出2~4行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n  '2p;4p'  user   #输出第2行与第4行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n '3,+1p' user   #输出第3行以及后面1行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@test1 ~]# sed -n '/^root/p' user   #输出以root开头的行  
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -n '/root/p' user   #输出包含root的行
root:x:0:0:root:/root:/bin/bash

[root@test1 ~]# sed -nr '/^root|^bin/p' user   #输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[root@test1 ~]# sed -n '1!p' user   #输出除了第1行的内容,!是取反
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n '$p'  user  #输出最后一行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@test1 ~]# sed -n '='  user   #输出行号,如果是$=就是最后一行的行号以上操作,如果去掉-n,在将p指令改成d指令就是删除
1
2
3
4
5

2.3 实例运用

2.3.1 实例1

编写脚本,搭建httpd服务,用82号端口开启服务

[root@test1 ~]# vim httpd.sh
#!/bin/bash
setenforce 0   #关闭selinux
yum -y install httpd &> /dev/null     #安装网站
echo  "sed-test~~~" > /var/www/html/index.html    #定义默认页
sed  -i  '/^Listen  80/s/0/2/'  /etc/httpd/conf/httpd.conf   #修改配置文件,将监听端口修改为82
systemctl restart httpd   #开服务
systemctl enable httpd   #设置开机自启

[root@test1 ~]# chmod u+x httpd.sh #给执行权限
[root@test1 ~]# ./httpd.sh   #执行脚本
setenforce: SELinux is disabled
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@test1 ~]# curl 10.100.10.175:82  #脚本运行之后,测试82端口
sed-test~~~
[root@test1 ~]# netstat -ntulp | grep httpd   #检查服务的端口是否为82
tcp6       0      0 :::82                   :::*                    LISTEN      18660/httpd  
2.3.2 实例2

编写脚本,找到系统使用bash的账户名,然后按照账户名 --> 密码” 的格式存储在一个文件中

[root@test1 ~]# vim yonghu.sh
#!/bin/bash
u=$(sed  -n  '/bash$/s/:.*#p'  /etc/passwd)  #找到passwd文档中以bash结尾的行,然后将行中冒号以及冒号后面内容都删除,此处的p代表仅仅显示s替换成功的行,最后赋值给u
for i in $u   #将那些用bash的账户名交给for循环
do
n=$(grep  $i:  /etc/shadow)   #用每个账户名去shadow中找对应信息
n=${n#*:}   #掐头,从左往右删除到第1个冒号
n=${n%%:*}   #去尾,从右往左删除到最后一个冒号经过上述步骤,n就是最终要的密码了
echo "$i --> $n"    #按格式喊出,如果要存到文件中就用追加重定向
done

[root@test1 ~]# chmod u+x yonghu.sh 
[root@test1 ~]# ./yonghu.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值