Linux有强大的文本处理功能,可以将命令组合起来,实现强大的功能。grep 负责搜索,awk 负责按列处理,sed 负责替换,sort 负责排序,uniq 负责统计,cut 负责切字段,xargs 负责批量执行。这些命令单独看都不复杂,但组合起来,排查日志、分析访问量、定位异常请求、清理数据,效率非常高,这次内容我们介绍80个能力。
1. 快速查看文件前几行
head app.log
默认看前 10 行。
指定行数:
head -n 50 app.log
2. 快速查看文件最后几行
tail app.log
指定最后 100 行:
tail -n 100 app.log
排查日志时最常用。
3. 实时追踪日志
tail -f app.log
更实用一点:
tail -n 200 -f app.log
先看最近 200 行,再持续刷新。
4. 日志轮转后继续追踪
tail -F app.log
-F 比 -f 更适合看被 logrotate 轮转的日志。
5. 搜索关键词
grep "ERROR" app.log
忽略大小写:
grep -i "error" app.log
显示行号:
grep -n "ERROR" app.log
6. 搜索多个关键词
grep -E "ERROR|Exception|timeout" app.log
-E 表示使用扩展正则。
7. 排除某些无用日志
grep -v "healthcheck" access.log
排查访问日志时,健康检查经常刷屏,先过滤掉很有用。
8. 搜索错误上下文
grep -C 5 "Exception" app.log
显示命中行前后各 5 行。
只看前面:
grep -B 10 "Exception" app.log
只看后面:
grep -A 10 "Exception" app.log
9. 递归搜索目录
grep -rn "database_url" .
常用参数:
-r 递归目录-n 显示行号
10. 只显示匹配到的文件名
grep -rl "ERROR" /data/logs
适合先定位哪些文件里有关键字。
11. 统计匹配次数
grep -c "ERROR" app.log
多个文件一起统计:
grep -c "ERROR" *.log
12. 实时日志只看错误
tail -f app.log | grep --line-buffered "ERROR"
--line-buffered 可以避免管道里输出延迟。
多个关键词:
tail -f app.log | grep --line-buffered -E "ERROR|Exception|timeout"
13. 用 less 查看大文件
less app.log
搜索关键词:
/ERROR
继续下一个匹配:
n
上一个匹配:
N
14. less +F:可暂停的 tail -f
less +F app.log
按 Ctrl+C 暂停实时刷新,然后可以搜索、翻页。
继续实时刷新:
F
15. 统计文件行数
wc -l app.log
统计多个文件:
wc -l *.log
16. 统计字节数、单词数、行数
wc app.log
输出通常是:
行数 单词数 字节数 文件名
17. 按列取内容:awk
取第一列:
awk '{print $1}' access.log
取第一列和第七列:
awk '{print $1, $7}' access.log
访问日志分析里非常常用。
18. 统计访问最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
这是经典组合拳。
含义是:
取 IP -> 排序 -> 统计次数 -> 按次数倒序 -> 取前几名
19. 统计访问最多的 URL
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
很多 Nginx/Apache 日志里,第 7 列是 URL 路径。
20. 统计 HTTP 状态码
awk '{print $9}' access.log | sort | uniq -c | sort -nr
可以快速看 200、404、500、502、504 的数量。
21. 筛选 500 错误
awk '$9 >= 500 {print}' access.log
看最近的 500 错误:
awk '$9 >= 500 {print}' access.log | tail -n 50
22. 筛选慢请求
假设日志最后一列是请求耗时:
awk '$NF > 1 {print}' access.log
$NF 表示最后一列。
筛选耗时超过 3 秒的请求:
awk '$NF > 3 {print}' access.log
23. 打印指定列并格式化
awk '{printf "%-20s %s\n", $1, $7}' access.log
printf 可以让输出更整齐。
24. 按分隔符取列
如果文件是 CSV:
awk -F, '{print $1, $3}' data.csv
如果是冒号分隔:
awk -F: '{print $1}' /etc/passwd
25. cut 快速切字段
取冒号分隔的第一列:
cut -d: -f1 /etc/passwd
取 CSV 第 2 列:
cut -d, -f2 data.csv
取第 1 到第 3 列:
cut -d, -f1-3 data.csv
26. sort 排序
sort file.txt
倒序:
sort -r file.txt
按数字排序:
sort -n numbers.txt
按人类可读大小排序:
sort -h sizes.txt
27. 按某一列排序
按第二列数字排序:
sort -k2 -n data.txt
按第二列倒序:
sort -k2 -nr data.txt
28. uniq 去重
sort file.txt | uniq
注意:uniq 只会去掉相邻重复行,所以通常要先 sort。
29. 统计重复次数
sort file.txt | uniq -c
按出现次数排序:
sort file.txt | uniq -c | sort -nr
30. 只看重复行
sort file.txt | uniq -d
31. 只看唯一行
sort file.txt | uniq -u
32. sed 替换文本
预览替换:
sed 's/old/new/g' file.txt
直接修改:
sed -i 's/old/new/g' file.txt
注意:macOS 和 Linux 的 sed -i 有差异,生产环境建议先备份。
33. 删除空行
sed '/^$/d' file.txt
删除注释行:
sed '/^#/d' config.conf
删除空行和注释行:
sed '/^\s*#/d;/^\s*$/d' config.conf
34. 打印指定行
打印第 100 行:
sed -n '100p' app.log
打印第 100 到 120 行:
sed -n '100,120p' app.log
35. 给日志加行号
nl app.log | less
或者:
cat -n app.log
如果是排查具体报错行,nl 很方便。
36. 替换多个空格为一个空格
tr -s ' ' < file.txt
整理命令输出时经常用。
37. 大小写转换
转小写:
tr 'A-Z' 'a-z' < file.txt
转大写:
tr 'a-z' 'A-Z' < file.txt
38. 删除特殊字符
删除回车符:
tr -d '\r' < windows.txt > linux.txt
Windows 文件传到 Linux 后出现奇怪换行时很有用。
39. xargs 批量处理
find . -name "*.log" | xargs grep "ERROR"
处理带空格文件名时更安全:
find . -name "*.log" -print0 | xargs -0 grep "ERROR"
40. 批量删除匹配文件
先预览:
find . -name "*.tmp" -print
确认后删除:
find . -name "*.tmp" -delete
或者:
find . -name "*.tmp" -print0 | xargs -0 rm
删除类命令一定先预览,别让手比脑子快。
41. 批量压缩日志
find /data/logs -name "*.log" -mtime +7 -print0 | xargs -0 gzip
把 7 天前的日志压缩。
42. 查找包含关键词的文件并复制出来
grep -rl "Exception" /data/logs | xargs -I{} cp {} /tmp/error_logs/
适合把问题日志集中出来分析。
43. 合并多个文件
cat *.log > all.log
合并后再分析:
grep "ERROR" all.log
44. 分割大文件
按行数分割:
split -l 100000 app.log app_part_
每 10 万行一个文件。
按大小分割:
split -b 100M app.log app_part_
大日志传输或离线分析时很有用。
45. 随机抽样
shuf access.log | head -n 100
从大日志里随机抽 100 行看看整体情况。
46. 去掉重复请求路径
awk '{print $7}' access.log | sort -u
sort -u 等价于排序后去重。
47. 提取 IP 地址
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' app.log
统计出现最多的 IP:
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' app.log | sort | uniq -c | sort -nr | head
48. 提取邮箱
grep -oE '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' file.txt
49. 提取 URL
grep -oE 'https?://[^ ]+' file.txt
从日志或文本里抓链接时很好用。
50. 查看压缩日志
zcat app.log.gz | less
搜索压缩日志:
zgrep "ERROR" app.log.gz
多个压缩日志一起查:
zgrep "Exception" *.gz
51. 统计压缩日志里的错误数
zgrep -c "ERROR" app.log.gz
52. 同时查普通日志和压缩日志
grep "ERROR" app.logzgrep "ERROR" app.log.*.gz
很多线上日志会同时保留当前日志和历史压缩日志。
53. 比较两个文件差异
diff -u old.conf new.conf
排查配置变更时非常有用。
比较两个目录:
diff -ru old_dir new_dir
54. 找两个文件的交集
先排序:
sort a.txt -o a.txtsort b.txt -o b.txt
找交集:
comm -12 a.txt b.txt
55. 找只在第一个文件里的内容
comm -23 a.txt b.txt
56. 找只在第二个文件里的内容
comm -13 a.txt b.txt
comm 很适合对比名单、IP 列表、URL 列表。
57. 横向合并文件
paste a.txt b.txt
指定分隔符:
paste -d, a.txt b.txt
58. 把多行变成一行
paste -sd, file.txt
会用逗号把多行拼成一行。
适合把 IP 列表、ID 列表变成参数。
59. 格式化成表格
column -t data.txt
指定分隔符:
column -s, -t data.csv
看 CSV 或命令输出会舒服很多。
60. 看不可见字符
cat -A file.txt
可以看到:
行尾符Tab特殊控制字符
排查格式异常时很有用。
61. 查看文件编码
file file.txt
有时中文乱码、脚本执行异常,问题可能是编码或换行符。
62. 转换编码
iconv -f GBK -t UTF-8 old.txt > new.txt
处理历史中文文件时经常用。
63. 去掉重复空格后按列分析
cat data.txt | tr -s ' ' | awk '{print $2}'
很多命令输出列之间空格数量不固定,先压缩空格再处理会更稳。
64. 分析某一分钟的日志
假设日志时间格式里有 2026-06-18 10:30:
grep "2026-06-18 10:30" app.log
统计这一分钟的错误:
grep "2026-06-18 10:30" app.log | grep -c "ERROR"
65. 按小时统计访问量
假设访问日志第 4 列是时间:
awk '{print substr($4, 2, 14)}' access.log | sort | uniq -c
可以快速看哪个小时流量异常。
66. 统计每分钟请求量
awk '{print substr($4, 2, 17)}' access.log | sort | uniq -c
适合看流量尖峰。
67. 找访问最多的 IP + URL 组合
awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr | head
可以判断是不是某个 IP 在疯狂刷某个接口。
68. 找 404 最多的 URL
awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr | head
69. 找 500 最多的 URL
awk '$9 >= 500 {print $7}' access.log | sort | uniq -c | sort -nr | head
这条很适合快速定位故障接口。
70. 找最慢的接口
假设最后一列是耗时:
awk '{print $NF, $7}' access.log | sort -nr | head
如果要只看接口路径:
awk '{print $7, $NF}' access.log | sort -k2 -nr | head
71. 清理日志里的颜色控制符
有些程序会输出 ANSI 颜色码,日志里看起来很乱:
sed -r 's/\x1B\[[0-9;]*[mK]//g' app.log
72. 快速生成测试文本
seq 1 10
生成 1 到 1000:
seq 1 1000
配合循环和测试脚本很方便。
73. 批量给每行加前缀
sed 's/^/[INFO] /' file.txt
每行末尾加内容:
sed 's/$/;/' file.txt
74. 删除每行前后的空白
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
处理配置、名单、导出数据时常用。
75. 查找超长行
awk 'length($0) > 1000 {print NR, length($0)}' app.log
可以定位异常日志、超大请求、堆栈爆炸。
76. 打印最长的 10 行
awk '{print length($0), $0}' app.log | sort -nr | head
77. 给命令结果加时间戳
tail -f app.log | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
有些日志本身没时间戳时,这招很救命。
78. 快速备份文件
cp config.yml config.yml.$(date +%Y%m%d_%H%M%S)
改配置前先备份,永远是好习惯。
79. 大文件搜索加速
LC_ALL=C grep "ERROR" app.log
LC_ALL=C 在一些场景下可以让文本搜索更快,尤其是纯英文日志。
80. 优先用 rg 搜代码和文本
如果系统有 ripgrep:
rg "ERROR"
显示行号、递归搜索、默认忽略 .git,速度很快。
搜指定文件类型:
rg "database_url" -t py
搜隐藏文件:
rg --hidden "secret"
最后
Linux 文本处理最强的地方,是命令之间可以不断组合。
比如排查接口 500:
awk '$9 >= 500 {print $7}' access.log | sort | uniq -c | sort -nr | head
排查异常 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
排查慢请求:
awk '{print $NF, $7}' access.log | sort -nr | head
排查日志里的错误上下文:
grep -C 5 "Exception" app.log
