正则表达式定义
正则表达式,又称正规表达式、常规表达式
使用字符串来描述、匹配一系列符合某个规则的字符串
●正则表达式组成
◆普通字符
大小写字母、数字、标点符号及一些其他符号
◆元字符
在正则表达式中具有特殊意义的专用字符
基础正则表达式元字符
(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开头的
goood
[root@localhost ~]# echo goood | grep "\ 匹配以goo开头的
goood
[root@localhost ~]# echo goood | grep "\
[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
扩展正则表达式元字符
扩展正则表达式是对基础正则表达式的扩充深化
扩展元字符:
●+:匹配前面子表达式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 '$='+文件名 打印此文件一共多少行