Linux文本处理命令详解 – grep/sed/awk实战技巧
a
admin
作者
2026-07-15
发布日期
约 9 分钟
阅读时间
Linux 文本处理是运维和开发的必备技能,掌握了这几个命令,处理日志、分析数据会事半功倍。
grep:文本搜索
最常用的文本搜索工具,按规则过滤内容。
# 基础搜索(在文件中查找关键词)
grep "error" /var/log/nginx/error.log
# 忽略大小写
grep -i "error" /var/log/nginx/error.log
# 显示行号
grep -n "error" /var/log/nginx/error.log
# 反向匹配(不含关键词的行)
grep -v "info" /var/log/nginx/error.log
# 递归搜索目录下所有文件
grep -r "function" /var/www/html/
# 只显示匹配的文件名
grep -l "error" /var/log/*.log
# 显示匹配行及后3行
grep -A 3 "error" /var/log/nginx/error.log
# 显示匹配行及前3行
grep -B 3 "error" /var/log/nginx/error.log
# 使用正则表达式
grep -E "error|warning|fatal" /var/log/nginx/error.log
实战:统计 Nginx 错误日志中 “error” 出现的次数:
grep -c "error" /var/log/nginx/error.log
sed:流编辑器
对文本进行批量编辑,擅长替换、删除、插入操作。
# 替换文本(每行第一个匹配)
sed 's/old/new/' file.txt
# 全局替换(每行所有匹配)
sed 's/old/new/g' file.txt
# 直接修改文件(不输出到屏幕)
sed -i 's/old/new/g' file.txt
# 删除包含特定字符串的行
sed '/pattern/d' file.txt
# 删除空行
sed '/^$/d' file.txt
# 显示指定行范围
sed -n '10,20p' file.txt
# 在每行开头添加内容
sed 's/^/prefix: /' file.txt
# 在每行末尾添加内容
sed 's/$/ :suffix/' file.txt
实战:把 Nginx 配置里的 80 端口全改成 8080:
sed -i 's/listen 80;/listen 8080;/g' /etc/nginx/nginx.conf
awk:文本分析
强大的文本分析工具,按列处理数据,适合处理结构化文本。
# 打印第1列
awk '{print $1}' file.txt
# 打印第1列和第3列
awk '{print $1, $3}' file.txt
# 按分隔符分割(默认空格)
awk -F: '{print $1}' /etc/passwd
# 按条件过滤(第3列大于100)
awk '$3 > 100' file.txt
# 按条件打印(第1列等于特定值)
awk '$1 == "error" {print $0}' /var/log/nginx/error.log
# 统计第1列每个值出现的次数
awk '{count[$1]++} END {for (word in count) print word, count[word]}' file.txt
# 计算第2列的总和
awk '{sum += $2} END {print sum}' file.txt
实战:统计 Nginx 访问日志中各 IP 的访问次数(top 10):
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
head / tail:查看文件头尾
# 查看文件前10行(默认)
head /var/log/nginx/error.log
# 查看前50行
head -n 50 /var/log/nginx/error.log
# 查看文件最后10行(默认)
tail /var/log/nginx/error.log
# 查看最后50行
tail -n 50 /var/log/nginx/error.log
# 实时监控文件新内容(看日志神器)
tail -f /var/log/nginx/error.log
# 实时监控并过滤
tail -f /var/log/nginx/access.log | grep "404"
tail -f 是运维必备:实时看日志更新,排查问题第一时间用它。
cut:按列截取
# 按冒号分割,取第1列
cut -d: -f1 /etc/passwd
# 按逗号分割,取第2、3列
cut -d, -f2,3 data.csv
# 取每行前10个字符
cut -c1-10 file.txt
sort / uniq:排序去重
# 排序(默认升序)
sort file.txt
# 降序排序
sort -r file.txt
# 按数字排序
sort -n file.txt
# 去重(先排序再去重)
sort file.txt | uniq
# 去重并统计出现次数
sort file.txt | uniq -c
# 按出现次数倒序排序
sort file.txt | uniq -c | sort -rn
wc:统计
# 统计行数
wc -l file.txt
# 统计单词数
wc -w file.txt
# 统计字符数
wc -c file.txt
实用组合示例
找出访问量最大的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
找出 404 错误最多的 URL
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
统计 Apache 进程占用的内存总量
ps aux | grep apache | awk '{sum += $6} END {print sum/1024 " MB"}'
提取日志中的错误信息并去重
grep "error" /var/log/nginx/error.log | awk '{print $NF}' | sort | uniq -c | sort -rn
总结
| 命令 | 作用 | 典型场景 |
|——|——|———|
| grep | 文本搜索 | 过滤日志 |
| sed | 流编辑 | 批量替换 |
| awk | 文本分析 | 按列统计 |
| head/tail | 查看头尾 | 看日志 |
| cut | 按列截取 | 解析字段 |
| sort/uniq | 排序去重 | 统计频次 |
| wc | 计数 | 统计行数 |
这几个命令组合起来,基本能搞定所有文本处理需求。
—
本文到此结束
—