您的位置:首页 > 运维架构 > Shell

shell脚本——正则表达式

2019-01-20 20:31 357 查看

基础正则表达式概述

正则表达式定义

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

基础正则表达式元字符

·基础正则表达式是常用的正则表达式部分
·除了普通字符外,常见到以下元字符
·\:转义字符,!、\n等
·^:匹配字符串开始的位置
·$:匹配字符串结束的位置
·.:匹配除\n之外的任意的一个字符
·*:匹配前面子表达式0次或者多次
·[list]:匹配list列表中的一个字符
·[^list] :匹配任意不在list列表中的一个字符
·{n,m}:匹配前面子表达式n到m次,有{n}、{n,}、{n,m}三种格式

编辑命令格式

[地址1[,地址2]]操作[参数]
·地址:可数字、正则表达式、$,没有地址代表是所有行
·操作:可以是a、c、d、p、s、r、w、i、s、y等
·参数:一般有g,代表只要符合条件的全部进行处理

Linux中文本处理工具:

Grep(只支持基础正则表达)
Egrep(支持扩展正则表达)
Sed(支持扩展正则表达)
Awk(支持基础正在表达支持扩展正则表达式)

Grep工具

-i:忽略大小写
-v:取反
过滤出
过滤掉

Grep ‘root’ /etc/passwd //筛选文件中包含root的行 Grep -v ‘root’ /etc/passwd

//筛选文件中不包括root的行 注:-v 表示过滤掉,不显示出来 Grep

‘r…d’/etc/passwd //筛选r和d之间有两个字符的行 Grep ‘[^s]bin’/etc/passwd
//筛选bin前面不是s的行 Grep ‘^$’ /etc/passwd //筛选出空白行 Grep ‘t[es]’
/etc/passwd //筛选包含字符串te或ts的行 Grep ‘0/{1,/}’ /etc/passwd
//查找数字0出现1次及以上的行 Grep -e ‘root’ -e ‘sshd’ /etc/passwd
//查找root和sshd的行,-e参数拆招多个模式 Grep ‘[^a-z]ae’ /etc/passwd
//筛选ae前面不是小写字母的行

Grep ‘^[a-z]ae’/etc/passwd
//筛选ze前面是小写字母的行
注:当使用连续的字符时,小写字母[a-z],大写字母[A-Z],数字[0-9] Grep ‘o*’
/etc/passwd /匹配所有内容(若有空白行的文件,甚至包括空白行)

Egrep工具

Egrep 0+ /etc/passwd			//匹配至少包含一个0的行
Egrep ‘(root|ntp)’ /etc/passwd	//匹配至少包含root活着ntp的行
Egrep ‘ro?T’ /etc/passwd			//匹配rt或者rot的行
Egrep -v ‘^$|^#’ /etc/passwd 		//过滤文件中空白行与#开头的行,没有空白行与#号开头的行,所以没有任何输出

Sed工具概述

·sed是文本处理工具,读取文本内容,根据指定的条件进行处理,如函数、替换、添加等
·可在无交互的情况下实现相当复杂的文本处理操作
·被广泛应用于shell脚本,以完成自动化处理任务
·sed依赖于正则表达式
工作原理

扩展正则表达式元字符

·扩展正则表达式是对基础正则表达式的扩充神话
·扩展元字符
·+:匹匹厄前面子表达式1次以上
·?:匹配前面子表达式-次或者1次
·():将括号中的字符串作为一个整体
·|:以或的方式撇配字条串

命令语法:

Sed -e ‘编辑指令’文件1 文件2… 注:-e,在’编辑命令’中可以有”;”来分隔执行命令
Sed -n -e ‘编辑指令’ 文件1 文件2… -n只显示过滤出内容
Sed -i -e ‘编辑指令’ 文件1 文件2… -i: 流编辑器,读一行处理一行

常用操作:

p:输出指定的行
d: 删除指定的行
s:子串替换,格式:“行范围s/旧字符串/新字符串/g”
r:读取指定条件
w :保存为文件
i:插入,在当前行前面插入一行或多行

输出指定的行:

Sed -n ‘p’ /etc/passwd //将所有内容shuch
Sed -n ‘7p’ /etc/passwd //将第七行内容输出
Sed -n ‘$p’ /etc/passwd //将最后一行输出
Sed -n ‘1,7{p:n}’ /etc/passwd //将1~7行中的奇数行输出
Sed -n ‘1,7{n:p}’ /etc/passwd //将1~7行中的偶数行输出
Sed -n ‘1,+4p’ /etc/passwd //从第一行,连续4行进行输出
Sed -n ‘/root/p’ /etc/passwd //将匹配包含root的行进行输出
Sed -n ‘/root/p’ /etc/passwd //将匹配包含root的行进行输出
Sed -n ‘10,/nom/p’ /etc/passwd //将从第10行至第一个包含nom的行进行输出
Sed -nr ‘/ro{1,}t/p’ /etc/passwd //匹配不少于1次前导字符0,加-r参数支持扩展正则表达式 rot root
Sed -n ‘/root|ntp/p’/etc/passwd //输出包含root或者ntp的行 注:如果遇到特殊符号,扩展正则需要转义符”\”
Sed -n ‘5p’ /etc/passwd //输出前5行信息后退出,q退出
Sed -n ‘5p ;7p;9p’/etc/passwd //输出5行、7行、9行信息插入符合条件的行:

Sed ‘root/i admin:x:490:490:`:/`:/sbin/nologin’/etc/passwd

//在包含root行的前面一行插入admin:x:490:490::/:/sbin/nologin

Sed		‘/root/a admin:x:490:490::/:/sbin/nologin’ /etc/passwd
//在包含root行的下一行插入

admin:x:490:490::/:/sbin/nologin’
Sed ‘3aADMIN’/etc/passwd

//在第三行之后插入ADMIN删除符合要求的行:

Sed ‘1d’ /etc/passwd //删除第一行
Sed ‘KaTeX parse error: Expected group after '^' at position 32: …//删除最后一行 Sed ‘/^̲/d’ /etc/passwd //删除所有空行
Sed ‘2,4d’ /etc/passwd //删除第2到4行
Sed ‘/root/d’/etc/passwd //删除包含root的行
Sed ‘/^root/d’ /etc/passwd //删除不包含root的行,这里的“i”表示取反操作
Sed ‘/^root/d’/etc/passwd //删除以root开头的行
Sed ‘nologin/d’/etc/passwd//删除以login结尾的行替换符合条件的文本:Sed‘s/root//g’/etc/passwd//将文件中所有的root都替换成空加g替换所有s:全部内容Sed‘/root/cadmin:x:490:490::/:/sbin/nologin’/etc/passwd//将含有root的行替换为490:490::/:/sbin/nologinSed−n‘s/root/admin/2p’/etc/passwd//把每行的第二个root替换成adminSed‘/root/s’/root/ROOT/g’/etc/passwd//将包含root的所有行中的root替换成ROOTSed‘1,3s/bin/BIN/g’/etc/passwd//将第1 3行中的算有bin都替换为BINSed‘s//d’ /etc/passwd //删除以login结尾的行替换符合条件的文本: Sed ‘s/root//g’ /etc/passwd //将文件中所有的root都替换成空 加g替换所有 s:全部内容 Sed ‘/root/c admin:x:490:490::/:/sbin/nologin’ /etc/passwd //将含有root的行替换为490:490::/:/sbin/nologin Sed -n ‘s/root/admin/2p’ /etc/passwd //把每行的第二个root替换成admin Sed ‘/root/s’ /root/ROOT/g’ /etc/passwd //将包含root的所有行中的root替换成ROOT Sed ‘1,3s/bin/BIN/g’ /etc/passwd //将第1~3行中的算有bin都替换为BIN Sed ‘s//d’/etc/passwd//删除以login结尾的行替换符合条件的文本:Sed‘s/root//g’/etc/passwd//将文件中所有的root都替换成空加g替换所有s:全部内容Sed‘/root/cadmin:x:490:490::/:/sbin/nologin’/etc/passwd//将含有root的行替换为490:490::/:/sbin/nologinSed−n‘s/root/admin/2p’/etc/passwd//把每行的第二个root替换成adminSed‘/root/s’/root/ROOT/g’/etc/passwd//将包含root的所有行中的root替换成ROOTSed‘1,3s/bin/BIN/g’/etc/passwd//将第1 3行中的算有bin都替换为BINSed‘s//ABC/’ /etc/passwd //在每行行尾插入字符串ABC
Sed ‘s/^/#/’ /etc/passwd //在每行行首插入#号
Sed ‘/root/s /^/#’ /etc/passwd //将包含root的行的行首插入#号
Sed ‘1c ABC’ /etc/passwd //将第一行替换为ABC
Sed ‘y/root/ROOT’ /etc/passwd //将root对应替换为ROOT
y:对应替换
Sed ‘/1,10y/root/ROOT/’ /etc/passwd //将第1~10行中的root替换为ROOT
迁移符合条件的文本:
Sed ‘15,16 w out.txt’ test.txt //另存为
Sed ‘5r /etc/reslov.conf’test.txt //将/etc/reslov.conf内容读取的当前文件第五行后面
Sed ‘1,5{H;d};$G’test.txt //在以IP开头的行的行首插入#
Sed ‘1,5H;15,16G’ test.txt
执行多次命令:
Sed -ne ‘s/root/admin/’-ne ‘s/bash/sh/p’ /etc/passwd //将root和bash动作替换
Sed -ne ‘s/root/admin/;s/bash/sh/p’ /etc/passwd //将root和bash动作替换
直接修改文件内容:有-i直接修改源文件,保存修改后的文件
Sed -i ‘s/^/#/’ /etc/passwd //在每行开头插入#号,直接修改源文件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: