一、正则表达式及grep:
概述:
正则表达式–简写:regex、regexp或RE,就是为处理大量的字符串而定义的一台规则和方法。例:假设“@”代表oldboy,”!” 代表eitboy。则echo “@!” =”oldboy eitboy”。通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
支持正则表达式的程序:
Linux正则表达式:grep、awk、sed
PHP、JAVA、Perl、Python(Perl兼容PCRE)
学习目的:
在企业工作中,每天做的Linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定字符串。这就需要正则表达式,因此,可以说正则表达式就是为过滤这样的字符串而生的。
正则表达式:
可以帮助运维,从过多的文件内容当中,获取你想要的任何数据
例:ifconfig的输出取IP,cat /var/log/messages输出取关键信息等。
注意事项:
1、 正则表达式应用非常广泛,存在于各种语言中,例:PHP、Python、JAVA、Perl等。但是,Linux 系统中的正则表达式,最常应用正则表达式的命令就是grep(egrep)、awk、sed,Linux三剑客想要更高效的工作,离不开正则表达式的配合。
2、 正则表达式与常用的通配符特殊字符是有本质区别的,一定要注意。
例:ls *.log中的 * 是通配符(表示所有),不是正则表达式。
基础正则表达式:
^word
搜索以word开头的。vi/vim中 ^
一行的开头。
word$
搜索以word结尾的。vi/vim中 $
一行的结尾。
^$
表示空行
.
代表且只能代表任意一个单个字符
\
例:\.
只代表点本身,转义符号,让有特殊身份意义的字符,脱掉马甲,还原;
\n
换行符
\r
匹配回车
\w
匹配任意一个字符和数字
*
重复0次或多次前面的一个字符。
.*
匹配所有字符。例:^.*
以任意多个字符开头,.*$
以任意多个字符结尾。
[abc]
匹配字符集内的任意一个字符。
[^abc]
不要abc这三个字符排列组合成的任意一个字符串。中括号里的 ^ 为取反。
[1-9]
只要包含1-9之内的数字,就打印该行
a\{n,m\}
重复n到m次前一个重复的字符。若用egrep、sed -r可以去掉斜线。
\{n,\}
重复至少n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线。
\{n\}
只打印前边出现n次的字符。若用egrep、sed -r可以去掉斜线
\{,n\}
打印前边的那个最多出现n次的字符
注:egrep,grep –E或sed –r 过滤一般特殊字符可以不转义。
扩展的正则表达式:
ERE(egrep或grep -E)
+
重复一次或一次以上前面的一个字符。等同于{n,}
?
重复0次或一次前面的一个字符。等同于{,m}
|
或者的意思,用或的方式查找多个符合的字符串。
()
找出括号内的字符串。
理解正则:
(提示:若不在shell中运行,正则要生效必须借助支持正则的工具)
扩展正则表达式:在grep中使用的话,要结合-E选项
需要使用grep -E或者egrep
如何将/etc/passwd文件中的前10行,输出到/root/test.txt:
head /etc/passwd > /root/test.txt head命令默认前十行
过滤出以root开头的行:
grep "^root" /root/test.txt
过滤出以halt结尾的行:
grep "halt$" /root/test.txt
过滤出adm这一行的前两行和后三行:
grep -B 2 -A 3 "adm" /root/test.txt
grep -C 2 "adm" /root/test.txt
过滤出test.txt文件中root在中间的行:
grep "root" test.txt | grep -v "^root" | grep -v "root$"
在shell脚本中,grep、sed、awk号称是shell脚本三剑客,而且这几个命令,是可以结合正则表达式来操作的■
grep "g.d" test.txt
grep g"o*"d test.txt
grep g".*"d test.txt
grep g"\."d test.txt