正则三剑客(一)

正则表达式

前言:

正则表达式的定义是:它使用单个字符串来描述或匹配;一系列符合某个句法规则的字符串。其实正则表达式只是一种思想,一种表示方法。常用的工具有grepsedawk等,它们都是针对文本操作的。

 

一、grep/egrep工具的使用

1grep的命令的格式为: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,表示重复n1n2次前面的字符,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

 

12egrep中()的应用

()表示一个整体,下例中会把包含rooo或者rato的行过滤出来

  # egrep 'r(oo|at)o' test.txt

 

  # egrep '(oo)+' test.txt

 

 

posted @ 2021-04-20 15:40  小小程序~猿~  阅读(81)  评论(0编辑  收藏  举报