当前位置:首页>Linux>80条Linux文本处理神技

80条Linux文本处理神技

  • 2026-09-10 05:23:52
80条Linux文本处理神技
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

最新文章

随机文章