Shell编程之正则表达式

文章目录

    • 一、正则表达式简介
      • 1.1 定义
      • 1.2 用途
    • 二、正则表达式
      • 2.1 基础正则表达式
        • 2.1.1 grep
        • 2.1.2 基础正则表达式中元字符总结
      • 2.2 扩展正则表达式
        • 2.2.1 扩展正则表达式中常见的元字符
        • 2.2.2 egrep
      • 2.3 文本处理器——sed工具
        • 2.3.1 sed工具简介
        • 2.3.2 sed工具用法
      • 2.4 awk工具
        • 2.4.1 awk的用法
        • 2.5 sort工具
        • 2.6 uniq 工具
        • 2.7 tr工具

一、正则表达式简介

1.1 定义

正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

​ 正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹 配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进 行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指 那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符 前面的字符)在目标对象中的出现模式。

​ 正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,例如 Linux 系统中常见的文本处理器(grep、egrep、sed、awk)以及应用比较广泛的 Python 语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。

1.2 用途

​ 对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达 式的魅力,而对于系统管理员来说,正则表达式则是必备技能之一。

​ 正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。

二、正则表达式

2.1 基础正则表达式

2.1.1 grep

首先来介绍几个可选项:-n,代表显示行号;-i代表不区分大小写;-v代表反向匹配,接下来看几个示例:

1、在abc.txt文件中查找不包含“text”的行,并显示行号

[root@localhost opt]# grep -nv 'text' abc.txt 

2、查找text和test两个字符串,并显示行号

[root@localhost opt]# grep -n 'te[xs]t' abc.txt 

3、查找“bcd”前面不是“a”的字符串,并显示行号

[root@localhost opt]# grep -n '[^a]bcd' abc.txt 

4、查找以小写字母为开头的行,并显示行号

[root@localhost opt]# grep -n '^[a-z]' abc.txt 

5、查找不以字母为开头的行,并显示行号

[root@localhost opt]# grep -n '^[^a-zA-Z]' abc.txt 

ps:"^"符号在元字符集合"[]"内外的作用是不一样的,在"[]"符号内表示反向选择,在"[]"符号外则表示定为行首。反之,若想查找以某一特定字符结尾的行则可以使用"$"定位符。

6、查找以小数点(.)为结尾的行,并显示行号

[root@localhost opt]# grep -n '\.$' abc.txt

7、查找空白行,并显示行号

[root@localhost opt]# grep -n '^$' abc.txt

8、查找“w??d”的字符串,并输出行号

[root@localhost opt]# grep -n 'w..d' abc.txt 

ps:意思是该字符串有四个字符,以w开头d结尾

9、查找第一个字符是t,字符h有没有或有多个的字符串,并显示行号

[root@localhost opt]# grep -n 'th*' abc.txt

10、查找以t开头,e结尾,中间可有可无的字符串,并显示行号

[root@localhost opt]# grep -n 't.*e' abc.txt

11、查找以w开头,d结尾,中间包含2-5个o的字符串

[root@localhost opt]# grep -n 'wo\{2,5\}d' abc.txt

2.1.2 基础正则表达式中元字符总结

元字符 作用
^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^”
$ 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$”
. 匹配除“\r\n”之外的任何单个字符
\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
* 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*”
[] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
[^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。 注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
{n} n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”
{n,} n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
{n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

2.2 扩展正则表达式

grep命令仅支持基础正则表达式,如果想使用扩展正则表达式,那么就要用到它的好兄弟egrep了。

2.2.1 扩展正则表达式中常见的元字符

元字符 作用
+ 重复一个或者一个以上的前一个字符
零个或者一个的前一个字符
| 使用或者(or)的方式找出多个字符
() 查找“组”字符串
()+ 辨别多个重复的组

2.2.2 egrep

1、"+",查找第一个字符是w,最后一个字符是d,中间有一个或一个以上o的字符串,并输出行号

[root@localhost opt]# egrep -n 'wo+d' abc.txt

2、"?",查找”bet“、”best“这两个字符串并输出行号

[root@localhost opt]# egrep -n 'bes?t' abc.txt

3、"|",查找"if"或者"at"或者"on"字符串并输出行号

[root@localhost opt]# egrep -n 'if|at|on' abc.txt

4、"()",查找“test"或"tast"字符串并输出行号

[root@localhost ~]# egrep -n 't(a|e)st' abc.txt

5、"()+",查找开头是“A”结尾是“C”,中间有一个以上的“xyz”字符串,并输出行号

[root@localhost ~]# egrep -n 'A(xyz)C' abc.txt

2.3 文本处理器——sed工具

2.3.1 sed工具简介

​ sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。

sed 的工作流程主要包括读取、执行和显示三个过程。

  • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

  • 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。

  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

2.3.2 sed工具用法

sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数

常见的sed命令选项主要包括:

  • -e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件
  • -f 或–file=:表示用指定的脚本文件来处理输入的文本文件
  • -h 或–help:显示帮助
  • -n、–quiet 或 silent:表示仅显示处理后的结果
  • -i:直接编辑文本文件

常见sed命令操作项包括:

  • a:增加,在当前行下面增加一行指定内容
  • c:替换,将选定行替换为指定内容
  • d:删除,删除选定的行
  • i:插入,在选定行上面插入一行指定内容
  • p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用
  • s:替换,替换指定字符
  • y:字符转换

例:

1、输出文件所有内容

[root@localhost ~]# sed -n 'p' abc.txt

2、输出文件第3-5行

[root@localhost ~]# sed -n '3,5p' abc.txt

3、输出所有奇数行(n代表读取下一行,下同)

[root@localhost ~]# sed -n 'p;n' abc.txt

4、输出所有偶数行

[root@localhost ~]# sed -n 'n;p' abc.txt

5、输出1-5行之间所有的奇数行

[root@localhost opt]# sed -n '1,5{p;n}' abc.txt

6、输出所有包含“the”的行

[root@localhost opt]# sed -n '/the/p' abc.txt

7、输出从第 4 行至第一个包含 the 的行

[root@localhost opt]# sed -n '4,/the/p' abc.txt

8、输出包含“the”字符串所在行的行号

[root@localhost opt]# sed -n '/the/=' abc.txt

9、输出以“he”结尾的行

[root@localhost opt]# sed -n '/the$/p' abc.txt

10、输出包含单词wood 的行

[root@localhost opt]# sed -n '/\/p' abc.txt

11、删除文件第3行

[root@localhost opt]# nl abc.txt | sed '3d'

12、删除以小写字母开头的行

[root@localhost opt]# sed '/^[a-z]/d' abc.txt

13、删除所有以“.”结尾的行

[root@localhost opt]# sed '/\.$/d' abc.txt

14、删除重复的空行(连续空行只保留一个)

[root@localhost opt]# sed -e '/^$/{n;/^$/d}' abc.txt

15、将文件中的所有"the"替换为"THE"

[root@localhost opt]# sed 's/the/THE/g' abc.txt

16、在每行行首插入#号

[root@localhost opt]# sed 's/^/#/' abc.txt

17、将第 3~5 行中的所有 the 替换为 THE

[root@localhost opt]# sed '3,5s/the/THE/g' abc.txt

迁移符合条件的文本

  • H:复制到剪切板
  • g、G:将剪切板的数据覆盖/追加到指定行
  • w:保存为文件
  • r:读取指定文件
  • a:追加指定文件

例:

1、将包含the 的行迁移至文件末尾

[root@localhost opt]# sed '/the/{H;d};$g' abc.txt

2、将第 1~5 行内容转移至第 17 行后

[root@localhost opt]# sed '1,5{H;d};15G' abc.txt

3、在第 3 行后插入一个新行,内容为New

[root@localhost opt]# sed '3aNEW' abc.txt

4、将包含the 的行另存为文件,名称为other.txt

[root@localhost opt]# sed '/the/w other.txt' abc.txt

2.4 awk工具

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

2.4.1 awk的用法

awk包含几个特殊的内建变量:

  • FS:指定每行文本的字段分隔符,默认为空格或制表位
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:数据记录分隔,默认为\n,即每行为一条记录

例:

1、输出文件所有内容

[root@localhost opt]# awk '{print}' abc.txt
或
[root@localhost opt]# awk '{print $0}' abc.txt 

2、输出1-3行内容

[root@localhost opt]# awk 'NR==1,NR==3{print}' abc.txt

3、输出文件中所有奇数行内容

[root@localhost opt]# awk '(NR%2)==1{print}' abc.txt

4、输出所有以the开头的行

[root@localhost opt]# awk '/^the/{print}' abc.txt

5、统计以空行分隔的文本段落数

[root@localhost opt]# awk 'BEGIN{RS=""};END{print NR}' 1.txt 

6、统计系统在线用户数

[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'

7、输出当前主机名

[root@localhost opt]# awk 'BEGIN { "hostname" | getline ; print $0}'

2.5 sort工具

在 Linux 系统中,常用的文件排序工具有三种:sort、uniq、wc。sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样。sort 命令的语法为“sort [选项] 参数”,其中常用的选项包括以下几种。

  • -f:忽略大小写
  • -b:忽略每行前面的空格
  • -M:按照月份进行排序
  • -n:按照数字进行排序
  • -r:反向排序
  • -u:等同于 uniq,表示相同的数据仅显示一行
  • -t:指定分隔符,默认使用[Tab]键分隔
  • -o <输出文件>:将排序后的结果转存至指定文件
  • -k:指定排序区域

例:

1、对账户文件passwd进行排序

[root@localhost opt]# sort /etc/passwd

2、对passwd文件中的第三列进行排序

[root@localhost opt]# sort -t ':' -rk 3 /etc/passwd

2.6 uniq 工具

Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项包括以下几种:

  • -c:进行计数
  • -d:仅显示重复行
  • -u:仅显示出现一次的行

例:

1、删除abc.txt文件中重复的行,并在行首显示重复次数

[root@localhost opt]# uniq -c 1.txt

2、查找abc.txt文件中重复的行

[root@localhost opt]# uniq -d 1.txt

2.7 tr工具

tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。

tr 具体的命令语法格式为:

tr [选项][参数]

其常用选项包括以下内容:

  • -c:取代所有不属于第一字符集的字符
  • -d:删除所有属于第一字符集的字符
  • -s:把连续重复的字符以单独一个字符表示
  • -t:先删除第一字符集较第二字符集多出的字符

例:

1、将大写的ABC转化为小写

[root@localhost opt]# echo "ABC" | tr 'A-Z' 'a-z'

2、删除字符串中的某些字符

[root@localhost opt]# echo "ABC" | tr -d 'B'

3、压缩输入中的重复字符(将多个重复变成一个)

[root@localhost opt]# echo "ABBBBBBBBC" | tr -s 'B'

.7 tr工具

tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。

tr 具体的命令语法格式为:

tr [选项][参数]

其常用选项包括以下内容:

  • -c:取代所有不属于第一字符集的字符
  • -d:删除所有属于第一字符集的字符
  • -s:把连续重复的字符以单独一个字符表示
  • -t:先删除第一字符集较第二字符集多出的字符

例:

1、将大写的ABC转化为小写

[root@localhost opt]# echo "ABC" | tr 'A-Z' 'a-z'

2、删除字符串中的某些字符

[root@localhost opt]# echo "ABC" | tr -d 'B'

3、压缩输入中的重复字符(将多个重复变成一个)

[root@localhost opt]# echo "ABBBBBBBBC" | tr -s 'B'

你可能感兴趣的:(Shell脚本,Linux)