一、正则表达式
1. 正则表达式定义
正则表达式(Regular Expressions,简称regex 或regexp、RE)是一种用于描述字符串模式的工具。它可以用于匹配、搜索、替换和验证文本
1.1 正则表达式工具
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:工
- grep
- sed
- awk
- egrep
1.2 正则表达式组成
正则表达式是由普通字符与元字符组成
- 普通字符包括大小写字母、数字、标点符号及一些其他符号
- 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
LINUX 中常用的有两种正则表达式引擎
- 基础正则表达式:BRE
- 扩展正则表达式:ERE
4. 基础正则表达式
基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)
特殊字符
\:转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义\\\\
^:匹配行首,^则是匹配字符串的开始^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}匹配时“{}"前不用加"\”
定位符:
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
非打印字符:
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
5. 扩展正则表达式
扩展正则表达式(支持的工具:egrep、awk)
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用 范围更广的扩展正则表达式。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达 式的元字符主要包括以下几个.
+ 作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串? 作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串| 作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串() 作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串()+ 作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思
例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用于查看生效的配置文件),执行“grep -v‘^$’test.txt | grep -v‘^#’”即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式
可以简化为“egrep -v‘^$|^#’test.txt”,其中,单引号内的管道符号表示或者(or)。
此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子
二、grep
grep 是一个用于在文件或标准输入中搜索文本模式的命令行工具。它基于正则表达式(regex)进行文本匹配,能够高效地查找和筛选文本内容
1. grep 常用参数
grep [选项] 查找条件 目标文件
-E :开启扩展(Extend)的正则表达式
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-o :只显示被模式匹配到的字符串
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(反向查找,输出与查找条件不相符的行)
--color=auto :可以将找到的关键词部分加上颜色的显示
-n :顺便输出行号
2.grep 操作案例
(1)查找特定字符
统计root字符总行数:
不区分大小写查找the所有的行:
过滤以nologin结尾的行:
过滤IP:
过滤并显示行号:
(2)利用中括号“[ ]”查找集合字符
“[ ]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的
若不希望“oo”前面存在小写字母,可以使用“grep [^a-z]oo’test.txt”命令实现,大写则是A-Z
查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现
(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[ ]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符
查询空白行时,执行“grep -n‘^$’test.txt”命令即可
(4)查找任意一个字符“.”与重复字符“*”
在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现
执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串
(5)查找连续字符范围“{}”
在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符
查询两个 o 的字符
查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串
三、sed
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务
1. sed 工作流程
sed 的工作流程主要包括读取、执行和显示三个过程。
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
2. sed 常用参数
sed [选项] '操作' 参数
常用的sed命令选项
-e 或--expression=: 表示用指定命令或者脚本来处理输入的文本文件
-f 或--file=: 表示用指定的脚本文件来处理输入的文本文件
-h 或--help: 显示帮助
-n、--quiet 或 silent: 表示仅显示处理后的结果
-i.bak: 直接编辑文本文件
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流
“操作” 用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。
常见的操作包括以下几种
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。
3. sed 操作示例
(1)输出符合条件的文本(p 表示正常输出)
sed -n 'p' test.txt #输出所有内容,等同于 cat test.txt
显示1-4行的内容:
输出包含 ”the“ 的行
输出以”he”开头的行
(2)删除符合条件的文本(d)
在执行删除操作之前最好先将测试文件备份
删除第二行:
删除1-3行:
删除带“was”的行:
删除以“.”符号结尾的行 (特殊字符需要转义):
删除空行:
(3)替换符合条件的文本
在使用 sed 命令进行替换操作时需要用到 s(字符串替换)
在每行头添加#:
在每行的结尾加上.bak :
将全局的o替换成O (若不加g则是将每行第一个o替换成O):
将1-3行的o替换成O:
将含有“was”的行中的o替换成O
(4)迁移符合条件的文本
H: 复制到剪贴板;
g、G: 将剪贴板中的数据覆盖/追加至指定行;
w: 保存为文件;
r: 读取指定文件;
a: 追加指定内容。具体操作方法如下所示。
I,i 忽略大小写
将行中包含“shot”的迁移到文本的行尾:
将cs.txt中含有“was”的行另存到cs2.txt (若没有cs2.txt,则自动创建)
将cs.txt的内容添加到cs2.txt中含有“was”的行下
在包含“and”行下插入BAK
(5)同时编辑
删除第二行;将第三行所有的o替换成O (-e可以同时进行操作)
(6)使用脚本编辑文件
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用
sed '1,5{H;d};16G' test.txt //将第 1~5 行内容转移至第 16 行后
例1:
写成脚本
执行时,sed -f:
- sed脚本文件第一行要声明#!/bin/sed -f
- 不要加单引号
- 每行的最后不能有空格等多余字符
- #号开头为注释
- 一行有多个命令时用分号隔开
四、awk
1. awk 介绍
是一个功能强大的文本处理工具,在类 Unix 操作系统中广泛应用。它以其名字的首字母命名,分别来自其最初三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan。awk 语言适用于数据提取和报告生成,是一种模式扫描和处理语言
- AWK:原先来源于 AT & T 实验室的的AWK
- NAWK:New awk,AT & T 实验室的AWK的升级版
- GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容
2. 工作原理
2.1 运行模式
- 正则表达式 : /root/ 匹配含有 root 的行 /*.root/
- 关系表达式: < > && || + *
- 匹配表达式: ~ !~ 动作:
- 变量 命令 内置函数 流控制语句它的语法结构如下
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }'
2.2 执行流程
开始块( BEGIN block )
主体块( Body Block )
结束块( END Block )
- 1、读(Read):从文件、管道或标准输入中读入一行然后把它存放到内存中
- 2、执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式
- 3、重复(Repeat):一直重复上述两个过程直到文件结束
3. 基本语法
格式: awk 关键字 选项 命令部分 '{xxxx}' 文件名
- FS:指定每行文本的字段分隔符,默认为空格或制表位。
- NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
- NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
- $0:当前处理的行的整行内容。
- $n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段
- FILENAME:被处理的文件名(当前输入文件的名)。
- FNR 各文件分别计数的行号
- OFS 输出字段分隔符(默认值是一个空格)
- ORS 输出记录分隔符(默认值是一个换行符)
- RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一条记录,以进行处理。预设值是" \n'
- 简说:数据记录分隔,默认为\n,即每行为一条记录
4.实战案例
4.1 内建变量
awk 包含几个特殊的内建变量(可直接用)如下所示:
- FS:指定每行文本的字段分隔符,默认为空格或制表位。
- NF:当前处理的行的字段个数。
- NR:当前处理的行的行号(序数)。
- $0:当前处理的行的整行内容。
- $n:当前处理行的第 n 个字段(第 n 列)。
- FILENAME:被处理的文件名。
- RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一 条记录,以进行处理。预设值是" \n'
- 简说:数据记录分隔,默认为\n,即每行为一条记录
打印文件内容:
打印文本内容的第一列和第二列 (默认以空格分隔)
以“:”为间隔,打印出文本第一列和第二列
以“x”为间隔,打印出文本第一列和第二列
以“:”和“/”为间隔,打印出文本第九列内容
4.2 内置变量
awk常用内置变量:$1、$2、NF、NR、$0
- $1:代表第一列
- $2:代表第二列以此类推
- $0:代表整行
- NF:一行的列数
- NR:行数
打印文本中包含root的行
以“:”为间隔,打印出包含root的行中第一列和第七列
打印第二行
打印行列
4.3 BEGIN 、END 运算
BEGIN
例:awk.txt 内容
![](https://i-blog.csdnimg.cn/direct/9112e246ae8148cfbfa2773614c0b701.png)
END
END则是先执行前面的打印内容再执行后面的打印标题行
结合BEGIN和END
例:计算出文本中所有数的总和并打印出来
4.4 其他内置变量的用法
FS:
在打印之前定义字段分隔符为冒号
OFS:
OFS定义了打印出来的内容以什么分隔,$1$2要,隔开
FNR:
追加文件重新从1开始
RS:
输入行分隔符,指定的是文件存在的字符
ORS:
多行合并一行输出,自定义“---”为分隔符
4.5 awk if 语句
第三列小于10的,打印整行
第三列小于5的打印整行,否则打印第一列