[Linux]编写shell正则表达式处理
1、grep命令
grep global search regular expression(RE) and print out the line,用于查找文件里符合条件的字符串。
egrep是grep的拓展,支持更多元字符,可通过-E 使用egrep功能
格式:grep [参数] [模式] [文件]
参数:
-E 开启扩展egrep
-i 忽略大小写
-v 取反
-n 显示行号
-w 单词匹配
正则表达式的使用:
^root 已root开头行
root$ 已root结尾
* 0到任意次的字符,例‘root*’匹配root出现0到任意次的行
? 0-1次,例‘?root’匹配root出现0到1次的行
+ 1到任意次,例‘+root’匹配root出现1到任意次的行
x{n} n次,例‘w{5}’匹配连续包含5个w且5个以上的行
x{m,n} m-n次,例‘w{3,9}’匹配包含3到9个w的行
\<XXXX 以XXXX字符开始,例‘\<roo’匹配以roo开头行
XXX\> 以XXXX字符结束,例‘ash\>’匹配以ash结尾行
\<XXXX\> 包含XXXX,例'\<bash\>'匹配包含bash行
'K...s' K开头中间三个字符以s结尾
'K.....' K开头中间包括结尾五个字符
'...s' 开头到中间三个字符s结尾
例:
(1)在/etc/passwd中匹配含有root行
(2)在/etc/passwd 中匹配含有bin的行
grep为贪婪匹配,若不加上- w参数将会匹配到包含bin的字段
(3)匹配字段忽略大小写
(4)对于匹配的字段进行取反匹配
(5)查找/etc/passwd可登陆的用户
(6)截取ifconifg显示的ip
(7)匹配出现0到任意次字符行
(8)匹配出现0到1次字符行
(9)匹配出现1到任意次字符行
(10)匹配w连续重复出现6次包括6次以上字符行
(11)匹配以K开头以s结尾中间包含3个字符的字符行
2、sed命令
stream editor,流编辑器,根据匹配模式程序化处理文本。
sed将从处理的目标文件中行读取加载进临时缓冲区(模式空间)中,处理完一行输出至屏幕,再加载下一行,只至目标文件最后一行。
格式:sed [option] 'command' file (command表示处理方式)
sed [option] -f scriptfile file (-f使用以写入文件的处理方式对目标文件处理)
参数:
-n 输出模式匹配的行
-f 将处理方式写入一个文件内,用–f scriptfile执行文件内的处理方式
-i 直接修改原文件内容
-e 多条处理方式
-r 支持扩展正则表达式
处理方式
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
= 显示行号
s 取代
(1)p(显示)处理方式
sed -n '2p' file4
显示第2行
sed -n '1,3p' file4
显示1到3行
sed -n -e '1p' -e '2p' file4
显示第1行和第2行
sed -n '/Third/p' file4
显示包含Third行
sed -n '/^Second/!p' file4
显示不以Second开头的行
(2)d(删除)处理方式
sed '/Line$/d' file4
删除以LIne结尾的行
sed '1,3d' file4
删除1到3行
sed '/Line$/!d' file4
不删除以LIne结尾的行
注:删除空白行为sed '/^$/d' file
(3)a(增加)处理方式
sed '/The/a hi' file4
对存在The的行的下一行添加hi
sed 'a hi' file4
对源文件的每行的下一行添加hi
sed 'a hi\nbye file4'
对源文件的每行的下一行添加hi,hi的下一行添加bye
(4)c(替换)处理方式
sed '/^Third/c www/' file4
将以Third开头的行替换成www
(5)w(写入)处理方式
sed '/Line$/w Linefile' file4
将以Line结尾的行写入到Linefile文件下
sed '1r Linefile' file4
将LInefile文件中内容插入到file4文件的第一行
sed 'r Linefile' file4
将LInefile文件中内容插入到file4文件的末尾
(6)i(插入)处理方式
sed '/^Last/i my' file4
在以Last开头的行的上一行添加my
(7)=(显示行号)
sed '/^Last/ =' file4
显示以Last开头行的行号
(8)s(取代)模式
sed 's/^/my /g' file4
将每行的开头取代为my
sed '1,3s/^/#/g' file4
1到3行的开头取代为#
sed '/^Last/s/^/my /g' file4
以Last开头的行开头取代为my
sed 's/end/kkk &/g' file4
在存在end的行中,在end前取代为kkk