正则三剑客(一)
正则表达式
前言:
正则表达式的定义是:它使用单个字符串来描述或匹配;一系列符合某个句法规则的字符串。其实正则表达式只是一种思想,一种表示方法。常用的工具有grep、sed、awk等,它们都是针对文本操作的。
一、grep/egrep工具的使用
1、grep的命令的格式为:grep [-cinvABC] ‘word’ firename
其选项如下所示:
-c:表示打印符合要求的行数。
-i:表示忽略大小写。
-n:表示输出符合要求的行及其行号。
-v:表示打印不符合要求的行。
-A:后面跟一个数字,例如-A2表示打印符合要求的行以及下面两行。
-B:后面跟一个数字,例如-B2表示打印符合要求的行以及上面两行。
-C:后面跟一个数字,例如-C2表示打印符合要求的行以及上下各两行。
(1)过滤出带有某个关键词的行,并输出行号。
# grep -n ‘root’ /etc/passwd
(2)过滤出不带有某个关键词的行,并输出行号。
# grep -nv ‘nologin’ /etc/passwd
(3)过滤出所有包含数字的行
# grep '[0-9]' /etc/inittab
(4)过滤出所有不包含数字的行
# grep -v '[0-9]' /etc/inittab
(5)过滤掉所有以#开头的行,编写操作样例文档如下所示:
# grep -v '^#' /etc/sos.conf
(6)过滤掉所有空行和以#开头的行:
# grep -v '^#' /etc/sos.conf |grep -v ‘^$’
在正则表达式中,^表示行的开始,$表示行的结尾,那么空行可以用^$表示,如何打印出不以英文字母开头的行呢?我们先自定义一个文件,如下所示:
# grep '^[^a-zA-Z]' test.txt
# grep '[^a-zA-Z]' test.txt
(7)过滤出任意一个字符和重复字符
# grep 'r.o' /etc/passwd //.表示任意一个字符
# grep 'ooo*' /etc/passwd //*表示零个或多个*前面的字符。
[root@localhost 1]# grep '.*' /etc/passwd |wc -l 21 //.*表示零个或多个任意字符,包括空格。 [root@localhost 1]# wc -l /etc/passwd 21 /etc/passwd
(8)指定要过滤出的字符出现次数
# grep 'o\{2\}' /etc/passwd
{},内部为数字,表示前面的字符要重复的次数,{}左右都需要加上转义字符\。还可以表示一个范围,具体格式为{n1,n2},其中n1 <n2,表示重复n1到n2次前面的字符,n2若为空,这时表示大于等于n1次。
(9)过滤出一个或多个指定的字符(egrep工具)
# egrep 'o+' test.txt
# egrep 'oo+' test.txt
# egrep 'ooo+' test.txt
和grep不同,这里egrep使用的是符号+,它表示匹配1个或多个+前面的字符,这个+不支持grep直接使用,包括{}也可以直接被egrep使用,而不用加\转义,示例如下:
# egrep 'o{2}' /etc/passwd
(10)过滤出零个或一个指定的字符
# egrep 'o?' test.txt
# egrep 'ooo?' test.txt
(11)过滤出字符串1或者字符串2
# egrep 'aaa|111|ooo' test.txt
(12)egrep中()的应用
()表示一个整体,下例中会把包含rooo或者rato的行过滤出来
# egrep 'r(oo|at)o' test.txt
# egrep '(oo)+' test.txt