一、正则表达式

1.1正则表达式的定义

正则表达式,又称规则表达式,(英语:Regular Expression)在代码中常简写为 regex、regexp 或 RE ,计算机科学的一个概念。

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本

正则表达式不只有一种,而且 Linux 中不同的程序可能会使用不同的正则表达式,如:

工具:grep sed awk egrep

正则表达式——通常用于判断语句中,用来检查某一字符串是否满足某一格式

正则表达式是由普通字符与元字符组成

普通字符:包括大小写字母、数字、标点符号及一些其他符号

元字符:是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

LINUX 中常用的有两种正则表达式引擎

基础正则表达式:BRE

扩展正则表达式:ERE

1.2 grep
格式:
grep [选项]... 查找条件 目标文件
选项 含义

-E 开启扩展(Extend)的正则表达式

-c 计算找到 ‘搜寻字符串’ 的次数

-i 忽略大小写的不同,所以大小写视为相同

-o 只显示被模式匹配到的字符串

-v 反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!(反向查找,输出与查找条件不相符的行)

- -color=auto 可以将找到的关键词部分加上颜色的显示

-n 顺便输出行号

1.3基础正则表达式

常见元字符:(支持的工具:grep、egrep、sed、awk)

特殊字符 含义

(反斜杠)\ 将特殊字符进行转义,忽略其特殊意义

^ 匹配行首,^ 则是匹配字符串的开始 ^tux 匹配以 tux 开头的行

$ 匹配行尾,$ 则是匹配字符串的结尾 tux$ 匹配以tux结尾的行

. 匹配除换行符\r\n之外的任意单个字符

[list] 匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]

[ ^list ] 匹配任意不在list列表中的一个字符 例: [ ^a-z ]、[ ^0-9 ]、 [ ^A-Z0-9 ]

* 匹配前面子表达式0次或者多次 例:goo*d、go.*d

\ {n \ } 匹配前面的子表达式n次, 例: go{2}d、’[O-9]{2}'匹配两位数字

\ {n, \ } 匹配前面的子表达式不少于n次, 例: go{2,}d、’ [0-9]{ 2, \ }'匹配两位及两位以上数字

\ {n,m \ } 匹配前面的子表达式n到m次, 例: go{2,3)d、’[0-9]{2,3}'匹配两位到三位数字

注: egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加 “ \ ”

[root@localhost home]# egrep -E -n 'wo{2}d' test.txt 
8:a wood cross!
[root@localhost home]# egrep -E -n 'wo{2,3}d' test.txt
8:a wood cross!
12:#woood #

定位符
^ :匹配输入字符串开始的位置
$ :匹配输入字符串结尾的位置

非打印字符
\n :匹配一个换行符
\r :匹配一个回车符
\t :匹配一个制表符

示例:

例:查看 test.txt 文件中以 t 开头的行

shell脚本值之正则表达式_字符串

[root@localhost ~]# grep -n '^t' test.txt 

4:the tongue is boneless but it breaks bones.12!

例:查看 test.txt 文件中以 s 结尾的行
[root@localhost ~]# grep -n 's$' test.txt

9:Actions speak louder than words

例:查看 test.txt 文件中 ,W后面有两个O的单词
[root@localhost ~]# grep -E -n wo\{2\}d test.txt

8:a wood cross!

例:查看 test.txt 文件中 ,W后面有两个或多个O的单词
[root@localhost ~]# grep -E -n wo\{2,\}d test.txt

8:a wood cross!
12:#woood #
13:#woooooood

例:“*”符号匹配任意字母数字
[root@localhost ~]# grep go[osad] test.txt

google is the best tools for search keyword.

匹配字符时,匹配的是上一个字符的次数

shell脚本值之正则表达式_元字符_02

1.4 扩展正则表达式

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式

与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达 式的元字符主要包括以下几个:

元字符 作用

+ 重复一个或者一个以上的前一个字符

? 零个或者一个的前一个字符

I(管道符) 使用或者(or)的方式找出多个字符

() 查找“组”字符串

()+ 辨别多个重复的组

示例:+:

shell脚本值之正则表达式_元字符_03

?:

shell脚本值之正则表达式_正则表达式_04

| :

shell脚本值之正则表达式_字符串_05

():

shell脚本值之正则表达式_正则表达式_06

()+:

shell脚本值之正则表达式_元字符_07

1.5 元字符操作案例

1.查找特定字符

查找特定字符非常简单,如执行以下命令即可从 test.txt 文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色

查找特定字符非常简单,如执行以下命令即可从 test.txt 文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色

若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号

2.利用中括号“[]”来查找集合字符

想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”

若要查找包含重复单个字符“oo”时,只需要执行以下命令即可

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[ ^ ]”来实现该目的。例如执行“grep -n‘[ ^w ]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串

在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知, “#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #”也符合匹配规则。

若不希望“oo”前面存在小写字母,可以使用

“grep -n‘[ ^a-z ]oo’test.txt”命令实现,其中“a-z”表示小写字母,大写字母则通过“A-Z”表示

查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现

3.查找行首“^”与行尾字符“$”

基础正则表达式包含两个定位元字符:“ ^ ”(行首)与“ $ ”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现

查询以小写字母开头的行可以通过“ ^ [a-z]”规则来过滤,查询大写字母开头的行则使用

“ ^ [A-Z]”规则,若查询不以字母开头的行则使用“^ [ ^a-zA-Z] ” 规则

“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符

当查询空白行时,执行“grep -n‘^$’test.txt”命令即可

**4.查找任意一个字符 “ . ” 与重复字符 “ * ” **

前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾

在上述结果中,“wood”字符串“w…d”匹配规则。若想要查询 oo、ooo、ooooo 等资料, 则需要使用星号()元字符。但需要注意的是,“”代表的是重复零个或多个前面的单字符。 “o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep

-n ‘o*’ test.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”,则第一个 o 必须存在, 第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准

若查询包含至少两个 o 以上的字符串,则执行“grep -n ‘ooo*’ test.txt”命令即可

查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现

执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串

执行以下命令即可查询任意数字所在行

5.查找连续字符范围“{}”

使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示

查询两个 o 的字符

查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串

查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串

二、文本处理器

2.1 cut:列截取工具

使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

注意:cut只擅长于处理单个字符为间隔的文本

格式:cut [选项]  参数

常用选项

选项

作用

-b

按字节截取

-c

按字符截取,常用于中文

-d

指定以什么为分隔符截取,默认为制表符

-f

通常和-d一起

示例:

例1:截取passwd文件的第一列

例2:截取passwd文件的第一列和第三列

例3:截取passwd文件的第一列到第三列

例4:截取who查询结果的第三个字节

例5:截取name文件中的第一个文字

2.2 sort :排序工具

是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

格式:sort [选项] 参数

常用选项

选项 作用

-t 指定分隔符,默认使用[Tab]吧 键或空格分隔

-k 指定排序区域,哪个区间排序

-n 按照数字进行排序,默认是以文字形式排序

-u 等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功

-r 反向排序,默认是升序,-r就是降序

-o 将排序后的结果转存至指定文件

示例:

sort passwd.txt    ###不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示

sort -n -t: -k3 passwd.txt ###以冒号为分隔符,以数字大小对第三列排序(升序)

sort -nr -t: -k3 passwd.txt ###以冒号为分隔符,以数字大小对第三列排序(降序)

sort -nr -t: -k3 passwd.txt -o passwd.bak ###将输结果不在屏幕上输出而是输出到passwd.bak文件
shell脚本值之正则表达式_正则表达式_08
2.3 uniq:去除连续的重复行

注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重


格式:uniq [选项] 参数


常用选项


选项 作用

-c 对重复的行进行计数

-d 仅显示重复行

-u 仅显示出现一次的行

示例:

例:创建一个水果类型的文件,一共9行内容

shell脚本值之正则表达式_元字符_09

例1:统计重复行的次数,不连续的重复行他不算做重复行

shell脚本值之正则表达式_元字符_10

例2:结合sort使用就是我们想要的效果

shell脚本值之正则表达式_正则表达式_11

例3:结合sort使用,过滤出重复行

shell脚本值之正则表达式_字符串_12

例4:结合sort使用,去重

shell脚本值之正则表达式_元字符_13

例5:也可以直接用sort -u

shell脚本值之正则表达式_字符串_14

示例:查看登陆用户

shell脚本值之正则表达式_元字符_15


2.4 tr :替换工具

可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符


格式:用法:tr [选项]… SET1 [SET2]


从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。


常用选项


选项 作用

-d 删除字符

-s 删除所有重复出现的字符,只保留第一个

示例:

shell脚本值之正则表达式_元字符_16


例1:将fruit文件中的小写a-z字母替换成大写的A-Z

shell脚本值之正则表达式_字符串_17

例2:替换(是一一对应的字母的替换)

shell脚本值之正则表达式_字符串_18

例3:把替换的字符用单引号引起来,包括特殊字符

shell脚本值之正则表达式_元字符_19

shell脚本值之正则表达式_字符串_20

例4:多个字符替换成一个

shell脚本值之正则表达式_元字符_21


例5:删除换行符

shell脚本值之正则表达式_正则表达式_22

例6:对p字符去重,只保留第一个

shell脚本值之正则表达式_元字符_23

例7:遇到多个回车只保留一个回车,相当于去除空行

shell脚本值之正则表达式_字符串_24