Shell编程之正则表达式与文本处理器

发布于:2024-06-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

正则表达式

1.正则表达式的定义

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

2.正则表达式的用途

正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这 些信息有些是非常重要的,有些则仅是告知的信息。

基础正则表达式

1. 基 础 正 则 表 达 式 示 例

( 1 ) 查 找 特 定 字 符

查找特定字符非常简单,如执行以下命令即可从test.txt    文件中查找出特定字符“the ”所 在位置。其中“-n” 表示显示行号、“-i”表示不区分大小写。

( 2 ) 利 用 中 括 号“D” 来查找集合字符

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

(3)查找行首“A”与行尾字符“$”

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

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

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

(5)查找连续字符范围“”

查找三到五个o  的连续字符,这个时候就需 要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell   中具有特殊意义,所以在 使用“”字符时,需要利用转义字符“”,将“(”字符转换成普通字符。

2. 元字符总结

扩展正则表达式

grep  命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用egrep 命 令 。egrep 命 令与 grep 命令的用法基本相似。 egrep 命令是一个搜索文件获得模式,使用该命令可以搜 索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串, 一个提示符可以是单个字符、 一个字符串、 一个字或一个句子。

文本处理器

在 Linux/UNIX  系统中包含很多种类的文本处理器或文本编辑器,其中包括我们之前学习过 的VIM 编辑器与grep 等。而 grep,sed,awk 更是 Shell 编程中经常用到的文本处理工具,被称之为 Shell 编程三剑客。

sed 工具

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

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

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

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

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

1.sed       命令常见用法

常见的 sed 命令选项主要包含以下几种。

-e  或--expression=: 表示用指定命令或者脚本来处理输入的文本文件。

-f 或--file=:   表示用指定的脚本文件来处理输入的文本文件。

-h 或--help:    显示帮助。

-n 、--quiet  或silent:  表示仅显示处理后的结果。

 -i:  直接编辑文本文件。

a:   增加,在当前行下面增加一行指定内容。

c: 替换,将选定行替换为指定内容。

d:    删除,删除选定的行。

i: 插入,在选定行上面插入一行指定内容。

p:   打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII 码输出。其通常与“-n”选项一起使用。

s:    替换,替换指定字符。

y:   字符转换。

( 2 ) 删 除 符 合 条 件 的 文 本 (d)

(3)替换符合条件的文本

(4)迁移符合条件的文本

在使用 sed   命令迁移符合条件的文本时,常用到以下参数.

H:复制到剪贴板;

g 、G: 将剪贴板中的数据覆盖/追加至指定行;

w:   保存为文件;

r:   读取指定文件;

a:    追加指定内容。

(5)使用脚本编辑文件

(6)sed       直接操作文件示例

awk 工 具

1.awk      常见用法前面提到sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后  再进行处理,且默认情况下字段的分隔符为空格或 tab 键 。awk 执行结果可以通过 print 的  功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符“&&”表示“与”、“I!” 表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、 -、*、1、%、^分别表示加、减、乘、除、取余和乘方。

awk 包含几个特殊的内建变量(可直接用)如下所示:

FS: 指定每行文本的字段分隔符,默认为空格或制表位。

NF:   当前处理的行的字段个数。

NR:   当前处理的行的行号(序数)。

$0:   当前处理的行的整行内容。

$n:   当前处理行的第n 个 字 段 ( 第n  列 ) 。

FILENAME:     被处理的文件名。

RS:    数据记录分隔,默认为\n,    即每行为一条记录。

2. 用 法 示 例

(1)按行输出文本

(2)按字段输出文本

(3)通过管道、双引号调用 Shell  命令

sort 工具

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

-f:   忽略大小写;

-b:   忽略每行前面的空格;

-M:  按照月份进行排序;

-n:   按照数字进行排序;

-r: 反向排序;

-u:   等同于uniq,  表示相同的数据仅显示一行;

-t: 指定分隔符,默认使用[Tab]键分隔;

- 0 :将排序后的结果转存至指定文件;

 -k:   指定排序区域。

 uniq 

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

-c: 进行计数;

-d: 仅显示重复行;

-u:   仅显示出现一次的行。

tr 工具

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

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

-C: 取代所有不属于第一字符集的字符;

-d:    删除所有属于第一字符集的字符;

-s:    把连续重复的字符以单独一个字符表示;

-t:    先删除第一字符集较第二字符集多出的字符。