正则介绍
在计算机科学中,对“正则表达式”的定义是:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串。在很多文本编辑器或其它工具里,正则表达式通常用来检索和替换那些符合某个模式的文本内容。许多程序设计语言也都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作和中,物理李娜是查找某个文档,还是查询某个日志文件并分析其内容,都会用到正则表达式。
其实正则表达式只是一种思想、一种表示方法。只要我们使用的工具支持这种表示方法,那么这个工具就可以处理正则表达式的字符串。常用的工具grep、sed、awak等。
grep命令
grep是用来过滤指定关键词的。
grep是一种强大的文本搜索工具,它能使用特定模式匹配搜索文本,并默认输出匹配行。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep [cinvABC] ‘word‘ filename
-c 表示打印符合要求的行数
-i 表示忽略大小写
-n 表示输出符合要求的行及其行号
-v 表示打印不符合要求的行
-r 递归的读取目录下的所有文件,包括子目录。
比如grep -r ‘root’/etc/ 会找出/etc/目录及子目录下的所有文件中,含有root字符串的行。
-A 后跟一个数字,例如-A 2 表示打印符合要求的行以及下面两行。
-B 后跟一个数字,例如-B 2 表示打印符合要求的行以及上面两行。
-C 后跟一个数字,例如-C 2 表示打印合格要求的行已经上下两行。
grep后不跟任何参数。
查找出文件passwd中带有字符串nologin的行。
grep -c
打印出文件passwd中含有nologin字符串的行数(有几行含有nologin。)
[[email protected] grep]# grep -c ‘nologin‘ /root/grep/passwd
17
grep -n
输出符合要求的内容,并显示行号。
grep -i
忽略大小写。
grep -v
取反,打印不符合要求的行。
在passwd文件中查找不含有nologin字符串的行。
grep -r
递归的读取目录下的所有文件,包括子目录。
比如grep -r ‘root’/etc/ 会找出/etc/目录及子目录下的所有文件中,含有root字符串的行。
grep -A
后面跟数字n,表示符合要求的行及下面n行。
grep -B
后面跟数字n,表示符合要求的行及上面n行。
grep -C
后面跟数字n,表示符合要求的行及上下n行。
grep ‘[0-9]‘ /etc/inittab
打印出文件中含有数字1-9其中一个的行。
grep -v ‘[0-9]‘ /etc/inittab
打印出文件中不含有数字0-9其中一个的行。
grep ‘^#‘ /etc/inittab
打印出文件中以#开头的行。
grep -v ‘^#‘ /etc/inittab
打印出文件中不以#开头的行。
再正则表达式中,^表示行的开始,$表示行的结尾,空行则可以用^$表示。
grep ‘^&‘ inittab
打印出文件中的空行。
grep -v ‘^&‘ inittab
打印出文件中的非空行。
[^字符]表示除[]内字符之外的字符。^有非的意思。
grep -n ‘^[^0-9]‘ inittab
打印出开头不为数字的行,并显示行号。
grep -nv ‘^[^0-9]‘ inittab
打印出开头为数字的行和空行,并显示行号。
grep -n ‘[^0-9]‘ inittab
打印出整行不为数字的行,并显示行号。
grep -nv ‘[^0-9]‘ inittab
打印出整行为数字的行和空行,并显示行号。
.表示任意一个字符。r.o表示r与o之间一个任意字符。
*表示零个或多个*前面的字符ooo*表示o、oo、ooo、oooo或者更多o。
grep -n ‘r.o‘ test
grep -n ‘o*o‘ test(*表示0个或多个*前面的字符)#查找文件中 1个o两个o或者更多o的行。
匹配*前面的g,且还要匹配g之前必须是huan。
grep -n ‘a*c‘ test 可以匹配到:
只含有字母c的,只含有字母a的,含有字母ac的
不能匹配到:不含字母a或字母c的。
.*表示零个或多个任意字符,空行也包含在内。
grep ‘.*‘ passwd
匹配passwd中的所有字符。
{n},n为数字,表示{}前面的字符重复n次。需要注意的是{}左右都要加上转移字符\。{}还可以表示范围,{n1,n2}其中n1<n2,表示重复n1到n2次前面的字符,n2可以为空,表示大于等于n1次。
+表示匹配+前面的字符出现1个或多次(*匹配*前面的字符出现0次或多次)
grep使用+时需要用\ 转义
egrep使用+时不需要用\ 转义
?表示匹配?前面出字符出现0次或1次
grep使用?时需要用\ 转义
egrep使用?时不需要用\ 转义
|(数线)表示或者的意思
grep使用|时需要用\ 转义
egrep使用|时不需要用\ 转义
()表示一个整体
grep使用|时需要用() 转义
egrep使用|时不需要用() 转义
grep -n ‘\(aa\)\+‘ abc 过滤出含有一个或多个aa字符串的。
注意:grep命令使用:{}、+、?、|、()这些符号时需要加上转义符\。egrep 命令使用时不需要加转义符\。