简单说,正则表达式是一套处理大量的字符串而定义的规则和方法
例如:假设@代表12345
通过正则表达式这些特殊符号,可以快速的过滤,替换需要的内容。
linux正则一般以行为单位来处理
在linux运维工作中,时刻面对着大量的日志,程序,命令的输出。迫切的需要过滤我们需要的一部分内容,甚至是一个字符串。
1)正则表达式的应用非常广泛,存在于各种语言中,如Perl,PHP,JAVA等。
此文档是linux中的正则表达式的相关应用及说明;
常见的正则表达式三剑客命令为:grep(egrep),sed,awk;要想三剑客更灵活,那就一定离不开正则表达式
2)linux正则表达式和我们命令行中其他的命令使用的通配符是有本质区别的。
eg: ll *.sh ;其中的*属于通配符
1)linux正则一般以行为单位来处理
2)设置别名,可让过滤的字符显示颜色; alias grep='grep --color=auto';可将别名设置放在/etc/profile文件中,并通过source /etc/profile使用配置生效。
3)注意字符集:LC_ALL=C
linux基于grep命令的正则表达式(注:过滤的是基于字符形式,非行结果)
^word ;表达搜索以word开头的内
eg:
#grep "^I" filename ;过滤以I开头的行
word$ ;表达搜索以word结尾的内容
eg:
#grep "m$" filename ;过滤以m结尾的行
^$ ;表示空行
eg:
#grep -v "^$" filename ;过滤非空行内容“-v”参数
. ;代表且只能代表任意一个字符
注释:此中的”.”表达过滤出任意字符,但因为没字符,所以没出来。
eg:
# cat test1
wangb
wan.bai
bai
gui
# grep "wan.b" test1 ;表示过滤wan并以任意一个字符b显示
注意"."是匹配一个字符
\ ;转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。
eg:
\^word ;表达^word字符,在此并不表示以word开头含义
* ;重复0个或多个前面的一个字符,不代表所有了。
eg:
# grep "0*" test1
wangdb00123
wa000012333n.bai
bai
gui
# grep -o "0*" test1 ;不加“-o”参数的话会显示所有
00
0000
.* ;匹配所有的字符
。。。
^.* ;表示以任意多个字符开头
。。。
[abc] ;匹配字符集合内任意一个字符[a-z]
[^abc] ;在中括号里面表示非,表示不包含a或b或c
{n,m} ; 重复n到m次,前一个字符
{n,} ; 至少N次,多了不限
{n} ; N次
{,m} ; 至多m次,少了不限。
注:grep 要对{转义} \{\},egrep不需要
eg:
#grep "0\{3,5\}" filename ;匹配3到5个0的字符过滤出来
#egrep "0{3}" filename
#grep -E --color=auto "0{1}" test ;加-E参数可不用加“\"转义符.
注:重要参数“-o” 只截取匹配的内容!!!
总结:
grep命令常参数
-v 排除匹配的内容
-E 支持扩展的正则表达式
-i 忽略大小写
-o 只输出匹配的内容
--color=auto 匹配的内容显示颜色
-n 显示行号
方法1:
方法1实现思路:先通过grep命令过滤出行,然后通过sed命令的^.*任意字符开始的,和.*$任意字符结尾的进行匹配。
[root@bogon zzbds]# cat test1
wangdb00
wa000012333n.bai
bai
gui
[root@bogon zzbds]# cat test1 |grep "wa00"
wa000012333n.bai
[root@bogon zzbds]# cat test1 |grep "wa00" |sed 's/^.*0000//g'
12333n.bai
[root@bogon zzbds]# cat test1 |grep "wa00" |sed 's/^.*0000//g'|sed 's/33n.*$//g'
123
方法2:
实现思路:要用到sed相关参数
sed:
s 替换
-i 修改
-n 取消默认输出
-p 打印内容
模板:sed -n 's#\(aaa\)\(bbb\)#\1\2#g'
[root@bogon zzbds]# ifconfig|sed -n 's/^.*addr:\(.*\) Bcast:.*$/\1/gp'
192.168.26.128
[root@bogon zzbds]#ifconfig|sed -n 's#^.*addr:\(.*\) Bcast:\(.*\) Mask.*$#\1 \2#gp'
192.168.26.128192.168.26.255
1)+ ; 重复一个或一个以上前面的字符
2)? ; 重复0个或一个前面的字符
3)| ; 用或的方式查找多个符合的字符串
4)() ; 找出“用户组” 字符串