文本处理与解析记
前言
在Linux世界中,有三把强大的文本处理工具,它们被称为”三剑客”:grep、sed和awk。这些工具是Linux系统管理员和开发者的必备技能,它们能够高效地处理文本数据,进行复杂的文本搜索、替换和报告生成等任务。
grep —— 文本过滤
介绍:grep 是 Linux 下最常用的文本搜索工具,也支持正则表达式,用于在文件中查找指定模式的文本行。
用法:grep 命令通常用于查找包含特定字符串或模式的行,支持文件搜索和管道输入。
参数:
-n: 显示匹配行的行号。-r: 递归查找指定目录下的文件。-i:忽略匹配项的大小写。--color: 在输出中高亮匹配的文本(通常以红色显示),使匹配结果更易于识别。"原kafka的IP:9091": 要查找的文本,可以字符串或正则表达式。--include="*.yaml": 仅查找扩展名为.yaml的文件。--exclude="*.yaml.bk":排除扩展名为.yaml.bk的文件。--exclude-dir="dir1":排除名称为dir1的目录
1 | |
sed —— 文本修改
介绍:sed 是流编辑器,用于对文本进行处理和转换。它可以按行处理文本,并支持使用正则表达式进行匹配和替换。
用法:sed 命令通常用于对文件内容进行替换、删除、插入等操作。
参数:
-i:直接修改原文件
1 | |
awk —— 文本处理
介绍:awk 是一种强大的文本处理工具,用于按行处理和分析文本数据。它支持处理字段(列)数据,并提供灵活的条件语句和循环结构。
用法:awk 命令通常用于从文本中提取指定字段、计算数据等操作。
基本用法
awk的基本用法就是下面的形式。
1 | |
单引号中有一对中括号,里面就是每一行的处理操作。其中,print是打印命令,$0代表当前行。
因此上面命令的执行结果,就是把每一行原样打印出来。
常用选项
-F:设置输入字段的分隔符。-v:向awk脚本传递变量。
-F
对于/etc/passwd文件,我们可以使用代码将它第一段的用户名进行输出
1 | |
使用-F参数,将这个文件的字段分隔符指定为:,再使用$1输出第一段内容
如果不-F指定,awk会默认根据空格和制表符(tab),将每一行分成若干字段
-v
-v:向awk脚本传递变量。
1 | |
执行流程
awk运行处理规则的执行流程,依次排序
BEGIN{}: 最开始执行//: 正则{}: 循环体END{}: 最后执行
awk语句中最少有一个,最多有四个!
内置变量
在 awk 中有许多内置变量,这些变量提供了关于当前处理行和字段的信息,可以帮助你更方便地对数据进行处理和分析。以下是一些常用的 awk 内置变量:
NF:表示当前行的字段(列)数。NR:表示当前记录(行)的行号。$0:表示整个当前行的内容。$1,$2,$3, …:表示当前行的第 1、2、3 个字段的内容,以此类推。FS:输入字段分隔符(默认为空格或制表符)。OFS:输出字段分隔符(默认为空格)。RS:输入记录分隔符(默认为换行符)。ORS:指定输出记录分隔符(默认为换行符)。FILENAME:当前输入文件的文件名。FNR:当前文件中的记录号(针对多个文件处理时的行号,从 1 开始)。ARGC:命令行参数的数量。ARGV:一个数组,包含命令行参数的值。BEGIN{FS=":"}:相当于指定以 : 为分隔符FS的优先级要高于 -F
例子:
1 | |
BEGIN{OFS=" >>> "}:指定打印分隔符
$NF:存储以 >>> 分隔符的最后一列
$1:存储以 >>> 分隔符的第一列
print:打印
函数
awk还提供了一些内置函数,方便对原始数据的处理。
toupper()将函数中的字符转为大写。tolower():将函数中的字符转为小写。length():返回函数中的字符串长度。substr():返回函数中的子字符串。sin():正弦。cos():余弦。sqrt():平方根。rand():随机数。index():搜索一个字符串内是否包含另一个子字符串- 如果找到子字符串,则返回子字符串在搜索字符串中第一次出现的位置。
- 如果未找到子字符串,则返回 0。
1
2$ index(str, substr [, start_position])
# start_position:搜索的起始位置,默认从搜索字符串的第一个字符开始(位置 1)。
将/etc/passwd的第一段字符和一行的长度输出,中间添加---优化输出可读性
1 | |
awk内置函数的完整列表,可以查看手册。
条件表达式 / 正则
awk允许指定输出条件,只输出符合条件的行。
格式为:awk '条件 动作' 文件名
==等于>大于>=大于等于<小于<=小于等于~正则匹配(包含)!~正则匹配(不包含)
输出包含root的行
1 | |
输出结尾包含bash的行
1 | |
输出结尾不包含bash的行
1 | |
匹配root开头的行
1 | |
算数表达式
+加-减*乘/除%求余
输出奇偶数行,NR表示当前行
1 | |
逻辑表达式
&&:逻辑与操作符,确保同时满足上述两个条件。||:逻辑或操作符,确保只需满足上述一个条件。
输出指定区间行数的行
1 | |
流程控制
if
在{}循环体中使用,有 不使用中括号 和 使用中括号 的两种格式
if() ;else if() ;else{}if(){}else if(){}else{}
例子:输出第一段有root的第一字段和最后一字段
不使用中括号:
1 | |
使用中括号:
1 | |
使用多个内置变量,也是用;分号
1 | |
如果输入行包含 “root”,则打印第一个字段。
1 | |
for
在{}循环体中使用,格式为:for(variable="变量初始值":条件判断:更新循环控制变量){}
例子:每一行打印10次
1 | |
while
在{}循环体中使用,格式为:while(条件判断){}
例子:while每一行打印10次
1 | |
xargs
介绍:可以从标准输入读取数据,并把这些数据作为参数传递给后面的命令。
参数:
-I {}: 读取输入数据,将其定义为一个占位符{}。在后续跟随的命令可以使用{}作为变量调用
Kafka IP迁移实践
结合上述实践,使用grep、awk、sed实现一个kafka的IP替换功能
1 | |