技术分享:Linux 运维三剑客(grep、sed、awk)深度实战指南

在 Linux 运维的日常工作中,我们每天都要和大量文本打交道 —— 日志排查、配置修改、数据统计、批量处理……grep、sed、awk这 “三剑客” 就是处理这些场景的终极武器。它们不是孤立的工具,而是一套可以组合使用的文本处理流水线。今天我将从原理、语法到实战场景,全方位拆解这三个工具,让大家熟悉和掌握它们的应用。

首先,是文本搜索神器:grep 它的核心定位:grep 是 Global Regular Expression Print 的缩写,它的核心是 “过滤”。它会逐行扫描输入文本,将匹配正则表达式的行输出到标准输出。它是你在海量文本中快速定位信息的第一选择。

高频实用场景

1.日志精准排查

# 在Nginx访问日志中,找出所有来自192.168.1.0/24网段的404错误

grep "192.168.1\..* 404" /var/log/nginx/access.log
# 搜索所有包含“error”或“fail”的行,并显示行号和上下文(前后各2行)

grep -n -A2 -B2 -E "error|fail" /var/log/messages

2.配置文件清理

# 清理掉配置文件中的所有注释行、空行和只含空格的行

grep -vE "^#|^$|^[[:space:]]*$" /etc/ssh/sshd_config > clean_sshd_config

3.代码仓库敏感信息扫描

# 在整个代码仓库中递归搜索包含密码(password)的文件,并列出文件名

grep -r -l "password" ./project/
核心参数详解

参数 作用

  1. -i 忽略大小写,如 grep -i “ERROR” 会匹配 error、Error 等
  2. -v 反向匹配,显示不满足条件的行
  3. -n 显示匹配行在原文件中的行号
  4. -E 使用扩展正则表达式(等价于 egrep)
  5. -F 将搜索内容作为固定字符串而非正则(等价于 fgrep)
  6. -r / -R 递归搜索目录下的所有文件
  7. -l 只输出包含匹配内容的文件名,而非具体行
  8. -A n 显示匹配行及后面 n 行
  9. -B n 显示匹配行及前面 n 行
  10. -C n 显示匹配行及前后 n 行(上下文)

然后,是流编辑器:sed 它的核心定位:sed 是 Stream Editor 的缩写,它是一个 “非交互式” 的行编辑器。它会从输入流中读取一行,处理一行,输出一行,直到文件末尾。它最擅长的是对文本进行批量的、自动化的修改。

高频实用场景

1.配置文件批量替换

# 将配置文件中的所有“192.168.1.100”替换为“10.0.0.50”,并创建备份

sed -i.bak 's/192.168.1.100/10.0.0.50/g' /etc/hosts

2.日志文件清洗

# 删除所有以“DEBUG”开头的调试日志行,只保留关键日志

sed '/^DEBUG/d' app.log > app_clean.log
# 替换掉所有日志中的敏感手机号(如138开头的手机号替换为138****1234)

sed -E 's/(138[0-9]{4})([0-9]{4})/\1****\2/g' access.log

3.文本行的插入与追加

# 在包含“server {”的行后面,插入一行新的配置

sed '/server {/a\    client_max_body_size 100M;' nginx.conf
# 在文件的第1行前插入版权声明

sed '1i\# Copyright (C) 2026 MyCompany' script.sh
核心语法与命令

替换: s/正则/替换内容/[flags]
g:全局替换(默认只替换每行第一个匹配项)
p:打印替换后的行(常与 -n 连用)
**删除: ** [地址范围]d

例如:

sed '5d' file.txt:删除第 5 行
sed '2,10d' file.txt:删除第 2 到 10 行

插入 / 追加: [地址] i\文本(插入),[地址]a\文本(追加)
打印: [地址范围] p(常与 -n 连用,只打印匹配行)

生产环境注意事项:-i 参数会直接修改源文件,建议在执行前先不加 -i 测试输出,或者使用 -i.bak 这样的形式自动创建备份文件。

再然后,是数据处理引擎:awk 它的核心定位:awk 不仅仅是一个工具,它更像一门解释型编程语言。它以 “字段” 为核心,非常适合处理表格化、结构化的数据。它可以进行数据提取、过滤、统计、排序和格式化输出,是处理日志和报表的不二之选。

高频实用场景

1.Nginx 日志深度分析

# 统计Nginx日志中,每个客户端IP的总访问流量(假设第10列是流量大小)

awk '{sum[$1] += $10} END {for (ip in sum) printf "%-15s %d KB\n", ip,   sum[ip]/1024}'   /var/log/nginx/access.log

2.系统资源监控与告警

# 监控CPU使用率,如果某个进程CPU占用超过80%就触发告警

ps aux | awk '$3 > 80 {print "ALERT: High CPU usage on PID " $2 " (" $11 ") at " $3 "%"}'

3.CSV 文件数据处理

# 处理一个以逗号分隔的CSV文件,提取第1列(姓名)和第3列(部门),并只显示部门为“技术部”的记录

awk -F ',' '$3 == "技术部" {print $1, "from", $3}' employees.csv

核心变量与语法
变量 含义

  1. $0 代表当前处理的整行内容
  2. $1, $2, …, $n 代表当前行的第 1、第 2…… 第 n 个字段
  3. NF 当前行的字段总数
  4. NR 当前处理的行号(从 1 开始)
  5. FS 输入字段分隔符(默认是空格或制表符)
  6. OFS 输出字段分隔符(默认是空格)

核心语法结构:

awk
awk 'BEGIN{初始化代码} 条件{处理动作} END{收尾代码}' 文件名

BEGIN{}:在处理任何输入行之前执行,用于初始化变量、打印表头。
条件{}:对每一行进行判断,满足条件则执行处理动作。
END{}:在所有输入行处理完成后执行,用于统计结果、打印最终报表。

最后,三剑客组合拳实战案例
在真实的运维场景中,我们很少单独使用一个工具,而是将它们串联起来,形成一条强大的文本处理流水线。

实战案例一:分析高并发下的 Web 服务瓶颈

# 1. 用grep筛选出所有状态码为502或504的错误请求

# 2. 用awk提取出请求的时间、URL和响应时间

# 3. 用awk统计哪个URL出现错误最多,并计算平均响应时间

grep -E " 502 | 504 " /var/log/nginx/access.log \
| awk '{print $4, $7, $NF}' \    #打印第4,7,最后字段
| awk '{url[$2]++; count[$2]++; sum[$2] += $3} END {for (u in url) print "URL: " u, "错误次数: " count[u], "平均响应时间: " sum[u]/count[u] "ms"}' \    #遍历关联数组,对每个 URL 计算平均响应时间,并格式化输出
| sort -k3 -nr     #按错误次数日志大小倒序排列,将统计结果按错误次数从高到低排序,快速定位最容易出问题的 URL

实战案例二:分析一个 Web 服务器的访问日志(access.log

#找出访问量最高的前 10 个 IP 地址。
示例命令

sed -E 's/^.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/' access.log | awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' | sort -nr | head -10

命令拆解
sed -E 's/^.*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$/\1/' access.log    :-E启用扩展正则,进行数据清洗,从任意格式的日志行中提取 IP
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}'      :统计核心,用 awk 数组完成计数和输出
sort -nr    :按 IP 地址的访问次数进行数值降序排序,让访问量最高的 IP 排在最前面。
head -10    :截取排序后的前 10 行,得到访问量最高的前 10 个 IP 地址
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐