正则表达式定义
正则表达式,又称正规表达式、常规表达式 使用字符串来描述、匹配一系列符合某个规则的字符串 ●正则表达式组成 ◆普通字符 大小写字母、数字、标点符号及一些其他符号 ◆元字符 在正则表达式中具有特殊意义的专用字符
基础正则表达式元字符
(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" 匹配到gdgggd[root@localhost ~]# echo abcd | egrep "g?d" 匹配到dabcd[root@localhost ~]# echo good | egrep "g?d" 匹配到d good[root@localhost ~]# echo goodxx | egrep "g?d" 匹配到d goodxx
示例( ):将括号中的字符串作为一个整体[root@localhost ~]# echo xxgoodxx | egrep "(good)" 匹配到goodxxgoodxx[root@localhost ~]# echo xxgoodxx | egrep "(goodx)" 匹配到goodxxxgoodxx[root@localhost ~]# echo xxgoodxx | egrep "(good)+" 匹配到goodxxgoodxx[root@localhost ~]# echo xxgoodxxgood | egrep "(good)+" 匹配到两个goodxxgoodxxgood [root@localhost ~]# echo xxgoodxxgood | egrep "(good)*" 匹配到两个goodxxgoodxxgood[root@localhost ~]# echo xxxxx | egrep "(good)*" xxxxx [root@localhost ~]# echo xxgoodxxgoodxxgood | egrep "(good)?" good作为一个整体三个都可以匹配到xxgoodxxgoodxxgood
示例 |:以或的方式匹配字条串[root@localhost ~]# echo goodfoodcool | egrep "good|cool" 匹配到good和coolgoodfoodcool[root@localhost ~]# echo goodfoodcool | egrep "g(oo|ol)d" 匹配到goodgoodfoodcool[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-ens33IPADDR=192.168.153.100NETMASK=255.255.255.0GATEWAY=192.168.153.2DNS1=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.txtIPADDR=192.168.153.100NETMASK=255.255.255.0GATEWAY=192.168.153.2DNS1=114.114.114.114DNS1=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.100NETMASK=255.255.255.0GATEWAY=192.168.153.2DNS1=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替换成xxxsed 's/root/xxx/gpi' 所有的root替换成xxxsed '/root/Ip'查找含有root的行,忽略大小写sed -n '10s/root/xxx/gpi'+文件名第十行root替换成xxxsed -n '1,10s/root/xxx/gpi'+文件名第一到十行root替换成xxxsed -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替换成大Osed -n 's/[0-9]/x/gp'+文件名 文件中的数字替换成xsed '1a hello world'+文件名 文件中第一行后面插入hello worldsed '1i hello world'+文件名 文件中第一行上面插入hello worldsed 'a hello'+文件名 每一行下面都插入hellosed '$a hello'+文件名在最后一行插入hellosed '/^root/a hello'+文件名 在root开头的行后面插入hello
sed -i 写入原文件中sed -i.bak '1,3a hello' zz.txt备份文件bak还是原来的,zz文件插入hellosed '1r /etc/hosts'+文件名读取另一个文件hosts中的内容显示在第一行后面sed 'w /opt/bak'+文件名 把文件名中的内容读取到bak下面sed '1w /opt/bak'+文件名 把文件名中第一行的内容读取到bak下面(覆盖命令)sed '/root/cxxxx'+文件名 含有root的行整行内容替换成xxxxsed -n '$='+文件名 打印此文件一共多少行