目录
一、正则表达式
1、正则表达式的概述
1.1 正则表达式的概念和作用
1.2 正则表达式支持的语言
1.3 正则表达式的优缺点
1.4 正则表达式的分类
1.4.1 基本正则表达式(BRE):
1.4.2 扩展正则表达式(ERE):
1.4.3 区别
1.5 帮助命令
2、基础正则表达式
2.1 字符匹配
2.1.1 元字符点
2.1.2 字符组
2.2 匹配次数
2.3 位置锚定
2.4 分组或其他
2.4.1 分组
2.4.2 或者
2.4.3 非打印字符
3、扩展正则表达式
3.2 字符匹配
3.2 匹配次数
3.3 位置锚定
2.4 分组或其他
二、文本处理三剑客之grep
1、grep用法
2、grep案例
2.1 匹配qq号
2.2 匹配邮箱
2.3 匹配手机号
2.4 查询 /etc/passwd 文件中有 root 的行
2.5 将非#开头和非空白行的文本写入到其他文本
2.6 匹配行首和行尾单词相同的行
2.7 多个模式条件匹配
2.8 提取出字符串中的所有数字
2.9 统计文件单词个数
三、文本处理三剑客之sed
1、sed概述
1.1 sed概念
1.2 sed工作原理
1.3 sed优缺点
2、sed基本用法
3、sed搜索替换
4、sed分组查找替换
5、sed变量查找
6、使用sed工具修改配置文件
6.1 直接修改httpd的80端口
6.2 修改网卡名
7、sed高级用法(了解)
四、文本处理三剑客之awk
1、awk的概述
2、awk基本用法
2.1 awk基本格式和执行流程
2.2 基本打印用法(动作 print)
2.3 常见的内置变量
2.5 模式PATTERN
2.6 awk结合数组运用
2.7 条件判断(if)
2.8 循环(for、while)
2.9 awk脚本(了解)
五、案例
1、统计当前主机的连接状态
2、统计当前连接主机数
3、过滤主机ip地址
4、 提取13:01到14:02之间的日志
5、提取下图ip地址及时间
6、提取host.txt主机名再放回host.txt文件
7、提取以数字形式显示/etc/passwd的权限
8、 统计/etc/fstab文件中每个文件系统类型出现的次数
9、打印偶数行
10、打印奇数行
1.1 正则表达式的概念和作用
REGEXP(Regular expressions)由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容
可用于匹配、搜索和替换文本。通过使用一系列的字符和元字符,以及特定的语法规则,正则表达式可以帮助你找到符合特定模式的文本
1.2 正则表达式支持的语言
vim, less,grep,sed,awk, nginx,mysql
1.3 正则表达式的优缺点
优点:
- 强大的模式匹配能力:正则表达式能够描述复杂的字符串模式,包括匹配特定字符、重复次数、字符集合等,使其可以用于强大的模式匹配和搜索
- 灵活性:正则表达式可以适应不同的文本模式,可以通过简洁而灵活的语法来描述各种匹配规则
- 广泛支持:正则表达式在许多编程语言和工具中得到广泛支持,可以在不同平台和环境下使用
- 文本处理和数据提取:正则表达式广泛用于文本处理、数据提取、文本替换等方面,能够快速、高效地进行字符串操作
缺点:
- 复杂性:正则表达式的语法相对复杂,有一定的学习曲线,特别是在处理复杂模式时,编写和理解正则表达式可能会有一定的困难
- 易读性:一些复杂的正则表达式可能难以阅读和理解,特别是对于不熟悉正则表达式的人来说,维护和修改这样的正则表达式可能会有困难
- 性能:一些复杂的正则表达式可能会导致性能问题,特别是在大型文本上进行匹配时,需要谨慎设计正则表达式以避免性能瓶颈
1.4 正则表达式的分类
1.4.1 基本正则表达式(BRE):
- 使用元字符时需在其前面添加反斜线转义:? 、 + 、 { 、 } 、 | 、 ( 和 )
- grep sed默认使用基础正则表达式
1.4.2 扩展正则表达式(ERE):
- 使用元字符时不需要在其前面添加反斜线转义:? 、 + 、 { 、 } 、 | 、 ( 和 )
-
grep -E、sed -r、egrep、awk扩展正则表达式
1.4.3 区别
元字符的区别:
- 基本正则表达式中需要使用反斜杠转义的方式来匹配特殊字符,比如代表分组,代表重复次数,而或等特殊字符需要使用反斜杠转义
- 扩展正则表达式中通常不需要使用反斜杠转义来匹配特殊字符,比如代表分组,代表重复次数,或等特殊字符不需要转义
重复操作符的区别:
- 基本正则表达式中和等重复操作符不具备特殊含义,需要使用反斜杠转义来表示它们的特殊含
- 扩展正则表达式中和等重复操作符可以直接使用,具有特殊含义
1.5 帮助命令
元字符
预订好且具有特殊含义的符号,这些符号能够进行通配
2.1 字符匹配
2.1.1 元字符点
2.1.2 字符组
2.2 匹配次数
2.3 位置锚定
位置锚定可以用于定位出现的位置
2.4 分组或其他
2.4.1 分组
2.4.2 或者
2.4.3 非打印字符
扩展正则表达式的元字符用法与基础正则表达式的元字符用法相差不大,区别在于扩展正则表达式不需要使用转义符,而基础正则表达式需要使用转义符
3.2 字符匹配
3.2 匹配次数
3.3 位置锚定
2.4 分组或其他
是一个强大的文本搜索工具,它可以在文件中查找特定模式的文本,并将包含这些模式的行进行筛选
2.1 匹配qq号
2.2 匹配邮箱
2.3 匹配手机号
2.4 查询 /etc/passwd 文件中有 root 的行
2.5 将非#开头和非空白行的文本写入到其他文本
2.6 匹配行首和行尾单词相同的行
2.7 多个模式条件匹配
2.8 提取出字符串中的所有数字
2.9 统计文件单词个数
1.1 sed概念
- 是一个流式文本编辑器,用于对文本进行替换、删除、插入等操作
- 可在无交互的情况下实现相当复杂的文本处理操作
- 被广泛应用于 Shell 脚本,以完成自动化处理任务
1.2 sed工作原理
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定行的地址,否则 sed 命令将会在所有的行上依次执行
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空
1.3 sed优缺点
优点
- 灵活强大的文本处理能力: 提供了丰富的文本处理命令和正则表达式支持,可以完成各种复杂的文本操作,如查找、替换、删除、插入等。它的功能强大且灵活,能够满足众多文本处理需求
- 高效处理大型文件: 是基于流处理的工具,逐行读取和处理文本,因此在处理大型文件时非常高效,不会占用过多的内存和系统资源。这使得它适用于处理大量文本数据
- 支持批量处理: 可以通过简单的命令一次性对多行文本进行处理,因此非常适合批量处理文本数据。它可以轻松地应用于一组文件或整个目录中的文件
- 跨平台支持: 是一个跨平台的工具,可在不同的操作系统上(如Linux、UNIX、macOS等)使用。这使得它在各种环境中都能发挥作用,具有广泛的适用性。
缺点
- 命令语法较复杂: 的命令语法相对较复杂,特别是对于初学者来说可能会有一定的学习曲线。对于一些复杂的处理任务,也可能需要深入了解正则表达式和高级命令才能灵活应用
- 只能处理单行文本: 是基于行的文本处理工具,因此无法直接处理多行文本。它只能处理当前行,对于需要跨行操作的任务,可能会显得不够方便
- 修改文件会覆盖原始数据: 默认情况下会直接修改文件内容,而不是将处理结果输出到标准输出。这意味着如果不小心操作,可能会不可逆地修改原始数据。因此,在使用 选项时应格外小心
- 不支持用户交互: 是一条命令行工具,通常在批处理环境下使用,并不支持与用户进行实时交互。这对于需要实时响应用户输入或交互的任务可能会有所不便
(1)格式
(2)选项
多点编辑,如sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
输出以r和以b开头的文本行
(3)自身脚本命令语法
自身脚本命令语法=地址+脚本操作命令
①地址
指定的行,如sed -n '2p' /etc/passwd
只打印指定的第二行
最后一行,如sed -n '$p' /etc/passwd
只删除打印的最后一行(对源文件无影响)
从第 m 行到第 n 行
sed -n '1,3p' /etc/passwd
只打印文件内容的第1到第3行
从第 m 行到第 m+n 行
sed -n '1,+4p' /etc/passwd
只打印文件内容的第1到第5行
第一个正则表达式和第二个正则表达式之间的行
如sed -n '/^r/,/^f/p' /etc/passwd
打印以r开头的行到以f开头的行中间的所有行
从#行为开始找到 pat为止
如sed -n '3,/^f/p' /etc/passwd
打印第三行到以b开头的行中间的所有行
找到#号个pat为止
如sed -n '/^r/,3' /etc/passwd
打印以r开头的行到第三行中间的所有行
奇数行, 第一个数为起始行后一个数字为前进步数
cat -n /etc/passwd | sed -n "1~2p"
只打印文件里的奇数行内容
偶数行, 第一个数为起始行后一个数字为前进步数
cat -n /etc/passwd | sed -n "2~2p"
只打印文件里的偶数行内容
②脚本操作命令
增加,在当前行下面增加一行指定内容,支持使用 实现多行追加
插入,在选定行上面插入一行指定内容
替换,将选定行替换为指定内容
删除,删除选定的行
保存模式匹配的行至指定文件
读取指定文件的文本至模式空间中匹配到的行后
打印当前模式空间内容,追加到默认输出之后。
如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容
注:
以上的操作其实是对输出内容的修改,其实对源文件本身没有影响,如果想修改源文件,需启用 -i 选项
sed可以用于修改配置文件,它可以从标准输入或文件中读取文本,并对其进行编辑和转换
6.1 直接修改httpd的80端口
6.2 修改网卡名
sed 中除了模式空间之外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据临时保存至保持空间,从而后续接着处理,实现更为丰富的功能
awk是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。 用于从文件、管道或标准输入中读取文本,并根据用户指定的模式和操作进行处理
- 文本提取和转换: 可以用 提取文件中的特定字段或行,并对其进行转换和格式化。
- 数据分析和报告生成: 可以利用 对结构化数据进行分析,并生成报告、统计信息或汇总数据。
- 文本格式化和处理: 可以使用 对文本进行格式化、排序、过滤和合并等操作。
- 自定义文本处理: 可以编写自定义的 脚本来实现特定的文本处理逻辑,满足特定的需求
2.1 awk基本格式和执行流程
注:
语法program通常是被放在单引号中,可分为pattern和action:
pattern:用于匹配输入文本的模式。可以使用正则表达式或字符串进行匹配。如果省略模式,则默认匹配所有行
action:对数据进行处理的操作,放在{}内指明,在满足模式的情况下要执行的动作。可以是单个命令或多个命令组合。如果省略动作,则默认打印整行。处理动作常见print、printf
①一定是单引号: '模式或条件{操作}'
② {}外指定条件,{}内指定操作
③ 内建变量不能使用双引号括起来,不然系统会把它当成字符串
执行流程:
① 执行BEGIN{action;… }{print}语句块中的语句
② 从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
从第一行到最后一行重复这个过程,直到文件全部被读取完毕
③ 当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
2.2 基本打印用法(动作 print)
2.3 常见的内置变量
指定每行文本的字段分隔符,默认为空格或制表位
与 “ -F ” 作用相同
(1)NR:行号
当前处理的行的行号(序数)
(2)NF
当前处理的行的字段个数
(3)FS
指定每行文本的字段分隔符,默认为空格或制表位,与 “ -F ” 作用相同
(4)OFS
输出内容的列分隔符
(5)RS
行分隔符,awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是" "
(6)$0
当前处理的行的整行内容
(7) FILENAME
显示处理的文件名
2.5 模式PATTERN
(1)模式为空
如果模式为空表示每一行都匹配成功,相当于没有额外条件
(2)正则匹配
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
(3)line ranges:行范围
不支持使用行号,但是可以使用变量NR间接指定行号加上比较操作符或者逻辑关系
(4)/pat1/,/pat2/
pat代表正则表达式,pat1到pat2 表示从正则表达式1到正则表达式2
(5)关系表达式
在awk中,关系表达式用于比较两个值,并返回一个布尔值(真或假)。这些表达式通常用于控制流程和过滤数据,关系表达式结果为“真”才会被处理。
真:结果为非0值,非空字符串
假:结果为空字符串或0
(6) BEGIN END
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
2.6 awk结合数组运用
在awk中,数组是一种非常有用的数据结构,用于存储和操作数据。awk中的数组是关联数组,也就是说它们可以使用字符串作为索引。
awk数组特性:
①awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串
- 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串
- awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
②awk数组支持数组的数组
(1)awk中定义数组打印
可以使用数组的索引来访问和修改数组元素的值
(2)数组长度
awk提供了 length() 函数来获取数组的元素个数,它也可以用于获取字符串的字符数量。还可以获取数值转换成字符串后的字符数量
(3)遍历数组
使用for循环来迭代数组中的元素
(4)awk打印文件内容去重统计
①去重打印数组
②处理文件去重统计
原理:将文件的字段内容变为定义的数组下标,对其进行匹配读取累加(只有遇到完全一致的才会累加),此时重复的次数在for循环的作用下成为了数组对应下标的元素,所以输出该下标和元素(就等同于输出重复的字段内容 以及统计的重复次数)
2.7 条件判断(if)
在awk中,条件判断通常用于控制程序的流程,以便根据特定条件执行不同的操作。条件判断通常与if语句结合使用
if语句:awk的if语句也分为单分支、双分支和多分支
2.8 循环(for、while)
在awk中,可以使用循环语句来重复执行一组操作,直到满足特定条件为止。awk支持for循环和while循环