Linux 运维三剑客(grep、sed、awk)深度实战指南
技术分享: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/
核心参数详解
参数 作用
- -i 忽略大小写,如 grep -i “ERROR” 会匹配 error、Error 等
- -v 反向匹配,显示不满足条件的行
- -n 显示匹配行在原文件中的行号
- -E 使用扩展正则表达式(等价于 egrep)
- -F 将搜索内容作为固定字符串而非正则(等价于 fgrep)
- -r / -R 递归搜索目录下的所有文件
- -l 只输出包含匹配内容的文件名,而非具体行
- -A n 显示匹配行及后面 n 行
- -B n 显示匹配行及前面 n 行
- -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
核心变量与语法
变量 含义
- $0 代表当前处理的整行内容
- $1, $2, …, $n 代表当前行的第 1、第 2…… 第 n 个字段
- NF 当前行的字段总数
- NR 当前处理的行号(从 1 开始)
- FS 输入字段分隔符(默认是空格或制表符)
- 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 地址
更多推荐




所有评论(0)