Linux正则表达式

1.1 grep/egrep工具的使用

该命令的格式为:grep [ -cinvABC ] ' word ' filename,其常用的选项如下所示。

  • -c:表示打印符合要求的行数
  • -i:表示忽略大小写
  • -n:表示输出符号要求的行及其行号
  • -v:表示打印不符合要求的行
  • -A:后面跟一个数字(有无空格都可以),例如-A2表示打印符号要求的行以及下面两行
  • -B:后面跟一个数字,例如-B2表示打印符号要求的行以及上面两行
  • -C:后面跟一个数字,例如-C2表示打印符号要求的行以及上下各两行

看看 -A、-B和-C这3个选项的用法。

  • -A2会包含halt的行以及这行下面的两行都打印出来:

Linux正则表达式

  • -B2会包含halt的行以及这行上面的两行都打印出来:

Linux正则表达式

  • -C2会包含halt的行以及这行上下各两行都打印出来:

Linux正则表达式

1.1.1 过滤出带有某个关键词的行,并输出行号
如图所示。

Linux正则表达式

1.1.2 过滤出不带有某个关键词的行,并输出行号
如图所示。

Linux正则表达式

1.1.3 过滤出所有包含数字的行
如图所示。

Linux正则表达式

1.1.4 过滤出所有不包含数字的行
如图所示。

Linux正则表达式

1.1.5 过滤掉所有以#开头的行
如图所示。(含有空行)

Linux正则表达式

1.1.6 过滤掉所有空行和以#开头的行

如图所示。(在正则表达式中,^表示行的开始,$表示行的结尾,那么空行则可以用^$表示)

Linux正则表达式
如何打印出不以英文字母开头的行,如图。

Linux正则表达式
中括号 [ ] 的应用,如果是数字就用 [0-9] 这样的形式(当遇到类似 [15] 的形式时,表示只含有1或5).如果要过滤数字以及大小写字母,则要写成类似 [0-9a-zA-Z] 的形式。另外, [^字符] 表示除 [ ] 内字符之外的字符。注意,把^写到方括号里面和外面是有区别的。

1.1.7 过滤出任意一个字符和重复字符

.表示任意一个字符。r.o表示把r与o之间有一个任意字符的行过滤出来,如图。

Linux正则表达式
*表示零个或多个星号前面的字符,如图。

Linux正则表达式
.*表示零个或多个任意字符,空行也包含在内,它会把 lljj/test.txt 文件里面的所有行都匹配到,如图。Linux正则表达式

1.1.8 指定要过滤出的字符出现次数

这里用到符号 { },其内部为数字,表示前面的字符要重复的次数。强调的是,{ }左右都需要加上转义字符 \。使用“{ }”还可以表示一个范围,具体格式为 {n1,n2},其中n1 < n2,表示重复n1到n2次前面的字符,n2还可以为空,这时表示大于等于n1次。

Linux正则表达式

egrep
1.1.9 过滤出一个或多个指定的字符

和grep不同,这里egrep使用的是符号+,它表示匹配1个或多个+前面的字符,这个“+”是不支持grep直接使用的,如图。

Linux正则表达式
包括{ },是可以直接被egrep使用的,不用加\转义,如图。

Linux正则表达式

1.1.10 过滤出零个或一个指定的字符
如图

Linux正则表达式Linux正则表达式

1.1.11 过滤出字符串1或者字符串2
如图

Linux正则表达式

1.1.12 egrep中()的应用
这里用()表示一个整体,会把包含rooo或者rato的行过滤出来,如图。

Linux正则表达式
另外也可以把()和其他符号组合在一起,例如(oo)+就表示1个或者多个oo,如图。Linux正则表达式

1.2 sed工具的使用
1.2.1 打印某行

sed命令的格式为:sed -n ' n 'p filename,单引号的n是一个数字,表示第几行。-n选项的作用是只显示我们要打印的行,如图。(把-n去掉应该是把第2行复制了一遍)

Linux正则表达式
要想把所有行都打印出来,可以使用命令 sed -n ’ 1,$ 'p filename,如图。Linux正则表达式
也可以指定一个区间打印,如图。

Linux正则表达式

1.2.2 打印包含某个字符串的行
如图。

Linux正则表达式

Linux正则表达式
sed命令加上-e选项可以实现多个行为,如图。

Linux正则表达式

1.2.3 删除某些行

这里参数d表示删除动作,它不仅可以删除指定的单行以及多行,而且可以删除匹配某个字符的行,还可以删除从某一行开始到文档最后一行的所有行。不过,这个操作仅仅是在显示器屏幕上并不显示这些行而已,文档还好好的,如图。

Linux正则表达式

1.2.4 替换字符或者字符串

参数s表示替换的动作,参数g表示本行全局替换,如果不加g则只替换本行出现的第一个,如图。

Linux正则表达式

1.2.5 调换两个字符串的位置

小括号在sed中属于特殊符号,必须在前面加转义字符\,替换时则写成类似\1、\2或\3的形式。用()把想要替换的字符打包成了一个整体,如图。

Linux正则表达式
除了调换两个字符串的位置,也可以在某一行前后增加指定内容,如图。Linux正则表达式

1.2.6 直接修改文件的内容

这样可以直接更改11.txt文件的内容。但注意,修改前最好先备份一下文件。

Linux正则表达式

1.3 awk工具的使用
1.3.1 截取文档中的某个段

-F选项的作用是指定分隔符。如果不加-F,则以空格或者tab为分隔符。print为打印的动作,用来打印某个字段。$1为第1个字段,$2为第2个字段,但$0比较特殊,它表示整行,如图。

Linux正则表达式
注意awk格式,-F后面紧跟单引号,单引号里面为分隔符。print的动作要用{ }括起来。否则会报错。print还可以打印自定义的内容,但是自定义要用双引号括起来。

1.3.2 匹配字符或字符串

它可以让某个段去匹配,这里的~就是匹配的意思。

Linux正则表达式

1.3.3 条件操作符

awk可以用逻辑符号进行判断,比如==就是等于,也可以理解为精确匹配。另外还有 >、>=、<、<=、!=等。在和数字比较时,若把比较的数字用双引号引起来,那么awk不会认为是数字,而是字符,不加双引号则会认为是数字。

Linux正则表达式
!=表示不匹配,它除了针对某一个段的字符进行逻辑比较外,还可以在两个段之间进行逻辑比较,如图。Linux正则表达式