七:Shell脚本:正则表达式与文本处理器三剑客grep,egrep, sed,awk

正则表达式定义
正则表达式,又称正规表达式、常规表达式
使用字符串来描述、匹配一系列符合某个规则的字符串
●正则表达式组成
◆普通字符
大小写字母、数字、标点符号及一些其他符号
◆元字符
在正则表达式中具有特殊意义的专用字符

基础正则表达式元字符
(1)、基础正则表达式是常用的正则表达式部分
(2)、除了普通字符外,常见到以下元字符
●: \ 转义字符,\ !、\n等
●: ^ 匹配字符串开始的位置
示例:^a、 ^the、 ^#
●: $ 匹配字符串结束的位置
示例:word$
●: . 匹配除\n之外的任意一个字符
示例:go.d 、g…d
●: * 匹配前面子表达式0次或者多次
示例:goo*d、go.*d
●: [list] 匹配list列表中的一个字符
示例:go[ola]d, [abc]、[a-z]、[a-z0-9]
●: [^list] 匹配任意不在list列表中的一个字符
示例:[a-z]、[^0-9]、 [^A-Z0-9]
●: \ {n,m\ }: 匹配前面的子表达式n到m次,有\ {n\ }、\ {n,\ } 、 \ {n,m\ }三种格式(转义字符与字母之间无空格)
示例:go\ {2\ }d、go\ {2,3\ }d、go\ {2,\ }d

在这里插入图片描述

中括号用法示例
[root@localhost ~]# echo ab | grep [abc]
ab
[root@localhost ~]# echo ab | grep [abc]
ab
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# echo abc | grep [abc]
abc
[root@localhost ~]# echo abcd | grep [abc]
abcd
[root@localhost ~]# echo ABC | grep [A-Z]
ABC
[root@localhost ~]# echo ABC | grep [a-z]   大小写分开匹配

[root@localhost ~]# echo ABC | grep [a-z0-9]
[root@localhost ~]# echo ABC0 | grep [a-z0-9]
ABC0
示例用法 [^list]  匹配任意不在list列表中的一个字符
[root@localhost ~]# echo ABC/0 | grep [^a-zA-Z0-9]
ABC/0             /为匹配到的结果

[ ]外面的^代表以什么开头,[ ]里面的是代表:非

在这里插入图片描述

示例 \ {n,m\ }: 匹配前面的子表达式n到m次,有\{n\}、\{n,\} 、\{n,m\}三种格式( 分别代表n次,大于n次,大于n次小于m次)
[root@localhost ~]# echo good | grep "go\{1,3\}d"
good
[root@localhost ~]# echo good | grep "go\{1\}d"
[root@localhost ~]# echo god | grep "go\{1\}d"
god
[root@localhost ~]# echo gd | grep "go\{1,\}d"
[root@localhost ~]# echo god | grep "go\{1,\}d"
god
[root@localhost ~]# 
[root@localhost ~]# echo goooood | grep "go\{1,\}d"
goooood
[root@localhost ~]# echo good | grep "go\{3,\}d"
[root@localhost ~]# echo good | grep "go\{2,\}d"
good
示例  **\< 匹配以什么什么开头的行**
[root@localhost ~]# echo goood | grep "\<g"        匹配以g开头的
goood
[root@localhost ~]# echo goood | grep "\<goo"      匹配以goo开头的
goood
[root@localhost ~]# echo goood | grep "\<oo"
[root@localhost ~]# echo goood | grep "^goo"       匹配以goo开头的
goood
[root@localhost ~]# echo goood | grep ^[ goo ]
grep: 无效的常规表达式
[root@localhost ~]# echo goood | grep ^[goo]        匹配以g开头的一个字符
goood
示例匹配以某个单词的行   \<......>\
[root@localhost ~]# echo od | grep "\<od\>"    od作为一个整体一个单词不可多不可少
od

扩展正则表达式元字符
扩展正则表达式是对基础正则表达式的扩充深化
扩展元字符:
●+:匹配前面子表达式1次以上
例: go+d,将匹配至少一个o
●?:匹配前面子表达式0次或者1次
例: go?d,将匹配gd或god
●( ):将括号中的字符串作为一个整体
例:(xyz)+,将匹配xyz整体1次以上,如xyzxyz
● |:以或的方式匹配字条串
例1: good|food,将匹配good或者food
例2: g(oo|la)d,将匹配good或者glad

在这里插入图片描述

示例扩展元字符  +:匹配前面子表达式1次以上
[root@localhost ~]# echo good | egrep "go+d"
good
[root@localhost ~]# echo good | egrep "g+d"    匹配不到o
[root@localhost ~]# echo gd | egrep "g+d"
gd
[root@localhost ~]# echo gggd | egrep "g+d"
gggd
示例 ?:匹配前面子表达式0次或者1[root@localhost ~]# echo gggd | egrep "g?d"   匹配到gd
gggd
[root@localhost ~]# echo abcd | egrep "g?d"   匹配到d
abcd
[root@localhost ~]# echo good | egrep "g?d"   匹配到d   
good
[root@localhost ~]# echo goodxx | egrep "g?d"  匹配到d 
goodxx
示例( ):将括号中的字符串作为一个整体
[root@localhost ~]# echo xxgoodxx | egrep "(good)"    匹配到good
xxgoodxx
[root@localhost ~]# echo xxgoodxx | egrep "(goodx)"  匹配到goodx
xxgoodxx
[root@localhost ~]# echo xxgoodxx | egrep "(good)+"  匹配到good
xxgoodxx
[root@localhost ~]# echo xxgoodxxgood | egrep "(good)+"  匹配到两个good
xxgoodxxgood 
[root@localhost ~]# echo xxgoodxxgood | egrep "(good)*"  匹配到两个good
xxgoodxxgood
[root@localhost ~]# echo xxxxx | egrep "(good)*"    
xxxxx  
[root@localhost ~]# echo xxgoodxxgoodxxgood | egrep "(good)?"   good作为一个整体三个都可以匹配到
xxgoodxxgoodxxgood
示例  |:以或的方式匹配字条串
[root@localhost ~]# echo goodfoodcool | egrep "good|cool"  匹配到good和cool
goodfoodcool
[root@localhost ~]# echo goodfoodcool | egrep "g(oo|ol)d"  匹配到good
goodfoodcool
[root@localhost ~]# echo godgcdgocdgoad | egrep "g(oc|oa)d"  匹配到gocdgoad 
godgcdgocdgoad
示例:{n} 前一个字符重复n次
[root@localhost ~]# echo godgcdgocdgoad | egrep "go{1}d"   匹配到god 
godgcdgocdgoad
[root@localhost ~]# echo godgcdgocdgoadg.d | egrep "g\.{1}d" 匹配到g.d 
godgcdgocdgoadg.d

示例过滤出ip配置文件中正确的地址

[root@localhost ~]# egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.153.100
NETMASK=255.255.255.0
GATEWAY=192.168.153.2
DNS1=114.114.114.114


[root@localhost ~]# egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /etc/sysconfig/network-scripts/ifcfg-ens33 > ipaddr.txt   过滤出信息放到ipaddr.txt
然后进入iPaddr.txt 写入错误信息DNS1=1141.1141.1141.1141

[root@localhost ~]# egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" ipaddr.txt
IPADDR=192.168.153.100
NETMASK=255.255.255.0
GATEWAY=192.168.153.2
DNS1=114.114.114.114
DNS1=1141.1141.1141.1141

[root@localhost ~]# egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" ipaddr.txt 
IPADDR=192.168.153.100
NETMASK=255.255.255.0
GATEWAY=192.168.153.2
DNS1=114.114.114.114
此时过滤不会再出现1141

sed工具概述
(1)文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
(2)可在无交互的情况下实现相当复杂的文本处理操作
(3)被广泛应用于Shell脚本,以完成自动化处理任务
(4)sed依赖于正则表达式
(5)工作原理:读取——执行——显示

工作原理:
1缓存等待处理
①有处理动个就进行处理再输出
②没有处理动作就直报输出
2输出到屏幕
再往下读取文件内容如此反复直到文件内容读完

sed命令格式
sed -e "编辑指令’ 文件1 文件2 …
sed -n -e ‘编辑指令’ 文件1 文件2 …
sed -i -e ‘编辑指令’ 文件1 文件2 …
常用选项
●-e指定要执行的命令,只有一个编辑命令时可省略
●-n只输出处理后的行,读入时不显示
●-i直接编辑文件,而不输出结果
●-f用指定的脚本文件来处理输入的文本文件

sed '' 文本名   不对它操作时 
sed 'p' 文本名   输出文本里面内容两遍
sed -n 'p' 文本名   输出文本里面内容一遍(p相当于打印一遍,-n取消打印的那一遍)
sed -n '1p' 文本名  输出第一行
sed -n '3p' 文本名  输出第三行
sed -n '1-3p' 文本名  输出第一到三行
sed -n '$p' 文本名   输出最后一行
sed -n '1,+4p' 文本名  输出五行
sed -n '1~2p' 文本名    从第一行开始每次加两行输出即第1 3 5 7 行等等
sed -n '2~2p' 文本名    从第二行开始每次加两行输出即第2 4 6 8行等等
sed -n '2~3p' 文本名    从第二行开始每次加三行输出即第2 5 8 11行等等
sed -n '2p;3p' 文本名   输出第二行和第三行
sed -n '/^root/p'  输出以root开头的行
sed -n '/ bash$/p' 输出以bash结尾的行
sed -n '/^root\|bash$/p'  输出以root开头的行bash结尾的行
sed -nr '/^root|bash$/p'  输出以root开头的行bash结尾的行
sed -ne '/^root/p' -e '/nologin$/p' 文件名  以root开头或者以mologin结尾的行 
sed -ne '2p' -e '4p'文本名  输出第二行和第四行
sed -n '/ /p' 文件名
sed -n '/\\/p' 文件名  过滤出含有\的行
sed -n 's#/bin/bash#/sbin/nologin#p' 文件名

sed -n 'd' 文件名 删除所有
sed -n '10d'    删除第十行
sed  '10d'    删除第十行,可看见删除过程 
sed '$d'     删除最后一行
sed '/root/d'   删除有root的行,区分大小写
sed 's/root/xxx/pi'    第一列中的root替换成xxx
sed 's/root/xxx/gpi'    所有的root替换成xxx
sed '/root/Ip'          查找含有root的行,忽略大小写
sed -n '10s/root/xxx/gpi'+文件名      第十行root替换成xxx
sed -n '1,10s/root/xxx/gpi'+文件名      第一到十行root替换成xxx
sed -n 's^#//p'+文件名          把文件中#开头的注释行#去掉
sed -n '1,2s/^/#/p'+文件名     把文件中没有#的第一二行加上#
sed -n 's/^ /#/p'+文件名       把文件中以空格开头的行加上#
sed -n 's/^bin/#&/p'+文件名    文件中以bin开头的行加上#
sed -n 's/o/O/gp'+文件名       文件中所有的小o替换成大O
sed -n 's/[0-9]/x/gp'+文件名   文件中的数字替换成x
sed  '1a hello world'+文件名   文件中第一行后面插入hello  world
sed  '1i hello world'+文件名   文件中第一行上面插入hello  world
sed 'a hello'+文件名           每一行下面都插入hello
sed '$a hello'+文件名          在最后一行插入hello
sed '/^root/a hello'+文件名    在root开头的行后面插入hello  
sed -i 写入原文件中
sed -i.bak '1,3a hello' zz.txt     备份文件bak还是原来的,zz文件插入hello
sed '1r /etc/hosts'+文件名          读取另一个文件hosts中的内容显示在第一行后面
sed 'w /opt/bak'+文件名             把文件名中的内容读取到bak下面
sed '1w /opt/bak'+文件名            把文件名中第一行的内容读取到bak下面(覆盖命令)
sed '/root/cxxxx'+文件名            含有root的行整行内容替换成xxxx
sed -n '$='+文件名                  打印此文件一共多少行

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值