一、正则表达式
●可以使用若干符号配合某工具对字符串进行增删改查操作
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
标签:bin,test1,sbin,shell,正则表达式,nologin,sed,adm,root
From: https://blog.csdn.net/bsqsb/article/details/143742954