侧边栏壁纸
博主头像
lance

不为失败找借口,只为成功找方法。

  • 累计撰写 28 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

用awk + grep + sed 搞定日志处理神器组合拳.md

lance
2025-06-05 / 0 评论 / 0 点赞 / 66 阅读 / 2,955 字
温馨提示:
本文最后更新于 2025-06-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

用awk + grep + sed 搞定日志处理神器组合拳

1 Linux三剑客简介

Linux三剑客指的是grep、sed和awk这三个强大的文本处理工具。

grep偏向于文本搜索,sed专注于文本编辑操作,awk提供更精细的过滤处理功能

它们各自具有独特的功能和优势,能满足不同的处理需求。掌握这些工具的使用,可以极大提高工作的效率。

2 grep搜索之剑详解

2.1grep 简介

grep 是一个强大的命令行工具,用于在文本文件中搜索指定的模式。它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。

需要注意的是,grep会将匹配到的整行输出,而awk可以指定某一行某一列进行输出。

主要应用场景有:日志分析和文本处理,grep可以从日志文件中找出错误信息或特定事件,也用于从大量文本文件中提取特定信息

2.2工作原理

grep进行文本搜索时主要进行以下三步:

(1)输入处理:grep 从指定的文件或标准输入中逐行读取数据,检查每行是否与用户提供的模式匹配。

(2)模式匹配:grep 采用正则表达式进行模式匹配,根据规则检查每一行是否符合条件。

(3)输出结果:当某行匹配成功时,grep 会将该行输出

2.3语法和可选项

(1)基本语法

grep [options]  pattern [file...]

options:可选参数,用来控制搜索的方式、输出格式等

pattern:必填项,是要搜索的模式或正则表达式,用于匹配文件中的内容

file:是要搜索的文件名或目录,可以是多个

(2)可选参数项

选项 描述
-E 使用扩展正则表达式,grep -E 等同于egrep
-i 忽略大小写
-r 递归搜索某个目录下的所有文件
-v 反向匹配,输出不匹配的行
-n 显示行号
-c 显示匹配行的总数,而不是打印匹配行
-A n 输出匹配的后n行
-B n 输出匹配的前n行
-C n 打印匹配前后的n行
-L 列出未包含匹配项的文件名
-o 只显示匹配到的字符串本身,而不是整个行
-w 精确匹配整词,防止匹配到包含该单词的部分词汇

2.4实战操作

(1) -i 选项 :忽略大小写

grep -i error /var/log/message
#打印处日志文件中所有包含error字符的,不论大小写

(2)-r 选项:递归查询

grep -ir /etc/nginx/conf.d
#输出/etc/nginx/conf.d目录所有关于www字符的行,常用查找域名或端口信息

(3)-E选项:支持扩展正则表达式(4)-v选项:反向匹配

grep -Ev '^#|^$'  /etc/nginx.conf
#过滤某个文件的所有空行和带#号注释的行

(5)-n选项:显示行号

grep -En 'root|ssh' /etc/passwd
#找出包含root和ssh字符的行号

(6)-A选项:查找后面几个字符

(7)-B选线:查找前面几个字符

(8)-C选择:查找前后几个字符

# 查找有错误的后面3行信息
grep -iA 3 error /var/log/messages
# 查找有错误的前面3行信息
grep -iB 3 error /var/log/messages
# 查找有错误的上下3行信息
grep -iC 3 error /var/log/messages

(9)-l 选项:查找文件名

# 查找文件包含root字符的文件名
grep -l root * 

3 sed:编辑之剑

3.1 sed简介

sed是编辑之剑:一个流编辑器,它允许用户在文本中进行文本替换,删除,添加等操作,sed支持基础和扩展的正则表达式,并提供了丰富的文本处理功能,如替换命令,地址定界等。sed的强大指出在于它可以非交互式编辑文件或标准输入,使其成为自动化文本处理的理想选择。

应用场景:批量替换,文本处理,通过sed命令可以快速替换文件中的特定字符串,如配置文件的修改,在shell脚本中结合其他命令如grep、awk等,实现复杂的文本处理任务。

3.2工作原理

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

它会从输入流中读取一行内容并存储到临时缓冲区(模式空间),然后根据设定的命令在模式空间中执行编辑操作,最后将处理后的内容输出到标准输出。

3.3语法、选项和动作介绍

(1)基本语法

sed [option] 'sed command' file

(2)常用选项

选项 描述
-n 只打印匹配处理的行,不修改文件
-e 允许多个编辑命令同时执行
-f 从脚本文件中读取并执行sed命令
-i 直接修改文件内容
-r 支持扩展正则表达式

(3)常用动作

动作 描述
p 打印模式空间的内容
a 在当前行后追加内容
i 在当前行前插入内容
c 用新文本替换模式空间中的内容
d 删除模式空间中的内容
s 替换内容

3.4实战操作

sed可以做增删改查操作。

cp /etc/passwd  /opt/passwd

(1)增加操作

主要有两个动作指令:a是追加内容到指定行后面,i是插入内容到指定行前面

# 在第2行后面追加内容
# 注意:这样只是打印出来,并没有修改文件里面的内容,如果要修改,需加-i参数
sed '1a 123' /opt/passwd 

# 在第一行前面插入内容,加-i后文件真实改变
sed -i '1i 456'  /opt/passwd

# 在最后一行后面追加内容
sed '$a 789' /opt/passwd

(2)删除操作

# 删除第一行
sed '1d'  /opt/passwd 

# 删除2-4行
sed '2,4d'  /opt/passwd

# 将匹配的行进行删除
sed '/\/bin\/bash/d' /opt/passwd

# 删除以root开头的行
sed '/^root/d' /opt/passwd

# 删除文中的空行和注释
sed -e '/^#/d' -e '/^$/d' /opt/passwd

(3)更改操作

s是用于替换操作的,日常中最为常用,配合g使用,可以替换全部匹配到的内容

# 替换常用模板,也可以将#改为/
sed -i 's#目标内容#替换内容#g' file

# 常用于修改selinux的命令
sed -i 'sy#=enforcing#=disabled#g' /etc/selinux/config

# 将nologin替换成login
sed 's/nologin/login/g' /opt/passwd

# 以mail开头的行,将该行所有的mail替换为gmail
sed '/^mail/{s#mail#gmail#g}' /opt/passwd 

(4)查找操作

# 只打印第三行内容
sed -n '3p'  /opt/passwd

4 awk:过滤之剑

4.1 awk简介

awk是一个编程语言工具,主要用于处理数据和生成报告。它能够按行和列分析文本文件,并对符合条件的数据执行操作,数据可以来自标准输入也可以是管道或文件。awk特别适合于处理结构化的文本数据,如日志文件、CSV文件等

4.2工作原理

awk的工作原理可以分为三个主要部分:BEGIN块、主循环体和END块。

BEGIN块中的代码在处理任何输入行之前执行,且只执行一次。它通常用于初始化变量或打印表头信息;

主循环体是awk的核心部分,逐行读取输入文件并对每行进行处理。它会按指定的分隔符(默认为空格或制表符)将每行分割成字段,并存入内建变量中;

END块中的代码在所有输入行处理完毕后执行,且只执行一次。常用于输出最终结果或总结信息

注意:在使用awk时不一定要每个部分都出现,根据实际处理需求来使用哪个部分。

具体的工作流程分为以下三步:

**读(Read):**从文件、管道或标准输入中读入一行然后把它存放到内存中

执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式

重复(Repeat):一直重复上述两个过程直到文件结束

4.3语法参数

(1)基础语法 awk指令是由模式、动作或者模式和动作的组合组成

awk [options] 'pattern {action}' file

(2)可选项

选项 描述
F <分隔符> 用于指定输入字段的分隔符,默认是空格,
可以使用逗号,冒号
-v <变量名>=<值> 用于定义一个变量并赋值
-f <脚本文件> 用于从指定的脚本文件中读取awk命令,
适用于awk指令较复杂场景
-r <扩展正则表达式 用于启用扩展正则表达式模式匹配功能
-s 用于禁用自动换行功能,使得awk在输出时
不会自动换行
-c <命令> 用于执行单个awk命令而不是从文件读取

(3)内置变量

变量 描述
NF 表示当前记录的字段数量
NR 表示已读的记录数(即行号)
FS 表示输入字段分隔符,默认为空格或制表符
OFS 表示输出字段分隔符
RS 表示输入记录分隔符,默认为换行符
$0 当前处理的行的整行内容
$n 当前处理行的第n个字段(第n列)

4.4实战操作

awk操作也是用/opt/passwd文件演示

(1)输出全文内容并附带行号

awk '{print NR,$0}' /opt/passwd

(2)只打印第五行

awk 'NR==2{print}'

(3)以: 为分隔符,打印第一列

awk -F ":" '{print $1}'  /opt/passwd

(4)以: 为分隔符,打印第2列和最后一列

awk -F ":" '{print $2,$NF}' /opt/passwd

(5)打印以:和/ 为分隔符且包含root的行的列数

awk -F ":/" '/root/{print NF}' /opt/passwd

(6)打印以:为分隔符包含root的行数和整行内容

awk -F ":/" '/root/{print NR,$0}' /opt/passwd

(7)格式化定制

[root@localhost ~]# awk -F ":" '{print "第"NR"行有"NF"列"}' /opt/passwd
第1行有1列
第2行有7列
第3行有7列
第4行有7列

生产环境BEGIN和END部分并不怎么常用,就不展开举例了

总结:

Linux三剑客是任何Linux用户或系统管理员必须掌握的工具。无论是简单的文本搜索、数据提取还是复杂的文本处理任务,这些工具都能提供强大的支持。

0

评论区