700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 七:Shell脚本:正则表达式与文本处理器三剑客grep egrep sed awk

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

时间:2020-06-26 15:46:31

相关推荐

七: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" 匹配到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 '$='+文件名 打印此文件一共多少行

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。