首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >三剑客出击:grep、sed、awk 一站式入门与实战

三剑客出击:grep、sed、awk 一站式入门与实战

作者头像
IT咸鱼
发布2025-06-09 17:47:03
发布2025-06-09 17:47:03
17900
代码可运行
举报
运行总次数:0
代码可运行

一、为什么要学“三剑客”?

在 Linux 运维中,文本处理是最常见的需求:

  • 从日志中筛选关键错误
  • 批量批改配置文件
  • 提取监控数据生成报表

而 grepsedawk就是三把利器:

  1. grep负责查找
  2. sed负责替换与批量编辑
  3. awk负责格式化与统计

掌握它们,你的运维效率会提升 N 倍!


二、准备工作:目录、文件、命令检查

在开始之前,请先在主服务器上创建一个示例目录,并准备一份测试文本:

代码语言:javascript
代码运行次数:0
运行
复制

# 登录到 master
ssh dba@master.example.com

# 创建工作目录
mkdir-p ~/dba-scripts/three-musketeers
cd ~/dba-scripts/three-musketeers

# 创建示例日志文件
cat> sample.log <<'EOF'
2025-05-24 10:00:01 INFO  Starting MySQL master
2025-05-24 10:05:12 WARN  Connection slow from 192.168.1.10
2025-05-24 10:10:45 ERROR Failed to replicate to slave1
2025-05-24 10:15:33 INFO  Cleaning up old backups
EOF

然后,务必检查三剑客命令是否可用:

代码语言:javascript
代码运行次数:0
运行
复制

forcmdingrepsedawk;do
command-v$cmd>/dev/null >&1
if[$?-ne];then
echo"错误:未检测到命令 $cmd,安装请执行 -> sudo dnf install -y $cmd"
exit
fi
done
echo"✅ grep、sed、awk 均已安装,可开始学习!"

如果看到 bash: grep: 未找到命令,就按提示安装;安装后重新登录或者执行 source ~/.bash_profile


图片
图片

三、grep:精确查找,你要的都在这里

3.1 基本用法

代码语言:javascript
代码运行次数:0
运行
复制

grep"ERROR" sample.log

解释

  • 默认区分大小写
  • 输出所有包含 “ERROR” 的行

3.2 常用选项

代码语言:javascript
代码运行次数:0
运行
复制
忽略大小写
代码语言:javascript
代码运行次数:0
运行
复制

# 查找所有含 error(不区分大小写),并显示行号
grep-in"error" sample.log

3.3 实战:找出最近一小时内的错误

假设日志按时间顺序记录,想要筛出最近一小时(60 分钟)内的 ERROR:

代码语言:javascript
代码运行次数:0
运行
复制

# 计算 60 分钟前的时间戳
START_TIME=$(date-d'1 hour ago' +"%Y-%m-%d %H:%M")
grep"${START_TIME::13}" sample.log |grep"ERROR"

若命令报 date: invalid date,请确认服务器时区与当前时间一致(timedatectl查看/修改)。


四、sed:批量替换与编辑,就用这一把

4.1 基本替换

代码语言:javascript
代码运行次数:0
运行
复制

# 将所有 WARN 替换为 WARNING,直接在终端输出
sed's/WARN/WARNING/g' sample.log
  • s/old/new/g:替换所有匹配

4.2 直接修改文件

代码语言:javascript
代码运行次数:0
运行
复制

# 先备份,再批量替换
cp sample.log sample.log.bak
sed-i's/WARN/WARNING/g' sample.log
  • -i:原地编辑
  • 注意:部分系统需要 -i ''或 -i.bak

4.3 实战:批量添加日期前缀

将每行前面加上当前日期时间戳:

代码语言:javascript
代码运行次数:0
运行
复制

sed-i"s|^|$(date +"[%F %T] ")|" sample.log
  • ^表示行首
  • "$(date ...)"嵌入 Shell 命令

如果报 sed: -e expression #1, char 1: unknown command:,请检查引号是否匹配,尽量用双引号包裹变量。


五、awk:复杂统计与格式化,一条命令搞定

5.1 基本字段提取

代码语言:javascript
代码运行次数:0
运行
复制

# 打印第 2 列(日志级别)和第 3 列(消息)
awk'{print $2, $3}' sample.log
  • 默认以空格或制表符分割字段

5.2 条件筛选

代码语言:javascript
代码运行次数:0
运行
复制

# 只显示 ERROR 级别的行,并打印行号与消息
awk'$2=="ERROR" {print NR, $0}' sample.log
  • $2=="ERROR":第二列等于 ERROR
  • NR:当前行号
  • $0:整行内容

5.3 实战:统计日志级别出现次数

代码语言:javascript
代码运行次数:0
运行
复制

awk'{count[$2]++} END {for(level in count) print level, count[level]}' sample.log
  • 使用数组 count统计
  • 在 END块中输出结果

输出示例:

代码语言:javascript
代码运行次数:0
运行
复制

INFO
WARNING
ERROR

如果出现 awk: cmd. line:1: syntax error,请确认使用的是 gawk或 mawk(系统自带一般是 gawk)。

六、联合三剑客:组合才能更强大

举例:先找出 ERROR 行,再替换关键字,最后统计出现次数:

代码语言:javascript
代码运行次数:0
运行
复制

grep"ERROR" sample.log \
|sed's/ERROR/CRITICAL/g'\
|awk'{count[$2]++} END{print "CRITICAL count:", count["CRITICAL"]}'

这样,你一次流水线操作就完成了复杂任务。

七、常见“命令未找到”排查

代码语言:javascript
代码运行次数:0
运行
复制
- grep 未安装:sudo dnf install -y grep- PATH 环境缺少 /usr/bin

下篇我们将带你深入了解 Linux 系统监控工具(top、htop、iotop、netstat)——让你的运维更上一层楼!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么要学“三剑客”?
  • 二、准备工作:目录、文件、命令检查
  • 三、grep:精确查找,你要的都在这里
    • 3.1 基本用法
    • 3.2 常用选项
    • 3.3 实战:找出最近一小时内的错误
  • 四、sed:批量替换与编辑,就用这一把
    • 4.1 基本替换
    • 4.2 直接修改文件
    • 4.3 实战:批量添加日期前缀
  • 五、awk:复杂统计与格式化,一条命令搞定
    • 5.1 基本字段提取
    • 5.2 条件筛选
    • 5.3 实战:统计日志级别出现次数
  • 六、联合三剑客:组合才能更强大
  • 七、常见“命令未找到”排查
  • 下篇我们将带你深入了解 Linux 系统监控工具(top、htop、iotop、netstat)——让你的运维更上一层楼!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档