shell脚本——正则表达式

1 篇文章 0 订阅
基础正则表达式概述
正则表达式定义

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

基础正则表达式元字符

·基础正则表达式是常用的正则表达式部分
·除了普通字符外,常见到以下元字符
·\:转义字符,!、\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 ’ / e t c / p a s s w d / / 删 除 以 l o g i n 结 尾 的 行 替 换 符 合 条 件 的 文 本 : S e d ‘ s / r o o t / / g ’ / e t c / p a s s w d / / 将 文 件 中 所 有 的 r o o t 都 替 换 成 空 加 g 替 换 所 有 s : 全 部 内 容 S e d ‘ / r o o t / c a d m i n : x : 490 : 490 : : / : / s b i n / n o l o g i n ’ / e t c / p a s s w d / / 将 含 有 r o o t 的 行 替 换 为 490 : 490 : : / : / s b i n / n o l o g i n S e d − n ‘ s / r o o t / a d m i n / 2 p ’ / e t c / p a s s w d / / 把 每 行 的 第 二 个 r o o t 替 换 成 a d m i n S e d ‘ / r o o t / s ’ / r o o t / R O O T / g ’ / e t c / p a s s w d / / 将 包 含 r o o t 的 所 有 行 中 的 r o o t 替 换 成 R O O T S e d ‘ 1 , 3 s / b i n / B I N / g ’ / e t c / p a s s w d / / 将 第 1   3 行 中 的 算 有 b i n 都 替 换 为 B I N S e d ‘ 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//loginSeds/root//g/etc/passwd//rootgs:Sed/root/cadmin:x:490:490::/:/sbin/nologin/etc/passwd//root490:490::/:/sbin/nologinSedns/root/admin/2p/etc/passwd//rootadminSed/root/s/root/ROOT/g/etc/passwd//rootrootROOTSed1,3s/bin/BIN/g/etc/passwd//1 3binBINSeds//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 //在每行开头插入#号,直接修改源文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值