Linux文本处理三剑客实战指南:grep、sed、awk

目录

  1. 三剑客简介与对比
  2. grep:文本搜索利器
  3. ✂️ sed:流编辑与批量替换
  4. awk:文本分析与格式化输出
  5. ⚔️ 易混辨析与命令对比
  6. 实战案例集锦
  7. 高频面试问答
  8. ️ 进阶技巧与最佳实践
  9. 三剑客组合实战
  10. 常见错误与排查建议

1. 三剑客简介与对比

  • grep:按模式搜索文本,输出匹配行,适合快速查找和过滤。
  • sed:流编辑器,支持查找、替换、插入、删除等批量文本处理。
  • awk:强大的文本分析与报告生成工具,支持条件判断、格式化输出、统计等。
工具 主要用途 适合场景 语法复杂度
grep 搜索/过滤 快速查找
sed 替换/编辑 批量修改
awk 分析/格式化 统计与报表

2. grep:文本搜索利器

2.1 原理简述与常见场景

  • grep基于正则表达式引擎,逐行扫描文本,输出匹配行。
  • 常用于日志分析、配置文件查找、批量过滤、代码搜索等。

2.2 基本用法

grep "pattern" file.txt

2.3 常用参数

  • -i:忽略大小写
  • -v:反向匹配(不包含模式的行)
  • -n:显示行号
  • -r:递归搜索目录
  • -E:支持扩展正则
  • -A N:显示匹配行后N行
  • -B N:显示匹配行前N行
  • -C N:显示匹配行前后N行

2.4 进阶正则用法

grep -E "^\d{3}-\d{2}-\d{4}$" data.txt   # 匹配SSN格式
grep -E "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" mail.txt  # 匹配邮箱

2.5 常见陷阱

  • 默认grep只匹配整行,不能高亮多个匹配(可用–color=auto)。
  • 匹配特殊字符需转义,如.*?等。
  • Windows与Linux换行符不同,跨平台处理需注意。

2.6 典型用法

grep "error" /var/log/syslog         # 搜索包含error的行
grep -i "warning" *.log              # 忽略大小写
grep -v "^#" config.conf             # 显示非注释行
grep -n "main" *.c                   # 显示行号
grep -r "TODO" src/                  # 递归搜索目录
grep -E "(error|fail)" app.log       # 多模式匹配
grep -A 2 -B 1 "exception" app.log   # 显示上下文

3. ✂️ sed:流编辑与批量替换

3.1 原理简述与常见场景

  • sed按行读取文本,基于模式空间进行编辑,支持正则、分组、条件处理。
  • 常用于批量替换、删除、插入、格式化、自动化脚本等。

3.2 基本用法

sed 's/old/new/' file.txt

3.3 常用参数

  • -n:静默模式(只输出被处理的行)
  • -e:多条编辑命令
  • -i:直接修改原文件(慎用)
  • -r:支持扩展正则
  • -f:从文件读取命令

3.4 进阶正则与多行处理

sed -E 's/(\d{4})-(\d{2})-(\d{2})/\3\/\2\/\1/g' date.txt  # 日期格式转换
echo -e "a\nb\nc" | sed -n '1,2p'  # 打印第1-2行
sed '/pattern1/,/pattern2/d' file.txt  # 删除两模式之间的内容

3.5 常见陷阱

  • -i参数会直接覆盖原文件,建议先备份。
  • 替换分隔符可用#等避免与路径冲突:sed 's#/usr/bin#/bin#g'
  • 多行处理需结合地址范围或脚本文件。

3.6 典型用法

sed 's/foo/bar/g' file.txt           # 全文替换foo为bar
sed -i 's/localhost/127.0.0.1/g' conf.ini  # 原地替换
sed -n '/error/p' app.log            # 只输出包含error的行
sed '/^#/d' config.conf              # 删除注释行
sed '2,5d' file.txt                  # 删除第2到5行
sed '1i\# 新增一行' file.txt         # 在首行前插入内容
sed 's/[0-9]\{3\}/***&***/g' data.txt # 匹配三位数字加标记

4. awk:文本分析与格式化输出

4.1 原理简述与常见场景

  • awk按行处理文本,自动分割字段,支持条件、循环、函数、数组。
  • 常用于日志分析、报表生成、批量统计、格式化输出等。

4.2 基本用法

awk '{print $1}' file.txt

4.3 常用参数与语法

  • -F:指定分隔符(默认空格)
  • NR:当前记录号(行号)
  • NF:当前行字段数
  • BEGIN/END:处理前/后执行

4.4 进阶用法与内置变量

awk 'BEGIN{FS=","; print "Name,Score"} {sum+=$2} END{print "Total:",sum}' data.csv
awk '{for(i=1;i<=NF;i++) a[$i]++} END{for(k in a) print k,a[k]}' file.txt  # 统计单词频率
awk 'length($0)>80' file.txt  # 打印超过80字符的行
常用内置变量
  • FS:输入字段分隔符
  • OFS:输出字段分隔符
  • RS:输入记录分隔符
  • ORS:输出记录分隔符
  • FNR:当前文件的记录数
  • ARGC/ARGV:参数个数/数组
数组与函数
awk '{arr[$1]+=$2} END{for(k in arr) print k,arr[k]}' data.txt  # 按第一列分组求和
awk 'function square(x){return x*x} {print $1,square($2)}' data.txt

4.5 常见陷阱

  • awk默认分隔符是空格,处理CSV需加-F ','
  • 字段引用用$1$2,不要漏写$
  • 复杂脚本建议写成awk脚本文件。

4.6 典型用法

awk -F ':' '{print $1,$3}' /etc/passwd    # 取用户名和UID
awk '{sum+=$2} END {print sum}' data.txt  # 求第2列和
awk '$3>80 {print $1,$3}' score.txt       # 条件筛选
awk 'NR==1,NR==5 {print $0}' file.txt     # 打印1-5行
awk 'BEGIN{print "Name Score"} {print $1,$2}' score.txt  # 加表头
awk -F ',' '{printf "%-10s %5.2f\n", $1, $2}' data.csv  # 格式化输出

5. ⚔️ 易混辨析与命令对比

功能 grep sed awk
搜索 ✅(/pattern/p) ✅($0~//)
替换 ✅(gsub/sub)
删除 ✅(条件不打印)
统计/汇总
格式化输出
多行处理 部分支持 支持 支持

易混辨析:

  • grep适合查找,sed适合批量替换,awk适合分析和格式化。
  • sed和awk都能做替换,但awk更适合复杂逻辑。

6. 实战案例集锦

6.1 日志分析:统计错误次数

grep -c "error" app.log
awk '/error/ {count++} END {print count}' app.log

6.2 批量替换配置文件IP

sed -i 's/192.168.1.1/10.0.0.1/g' *.conf

6.3 统计磁盘使用前10大文件

du -ah | sort -hr | head -10

6.4 取出CSV文件指定列并格式化

awk -F ',' '{printf "%s\t%s\n", $1, $3}' data.csv

6.5 批量删除空行和注释

sed '/^$/d;/^#/d' file.txt

7. 高频面试问答

Q: grep、sed、awk三者的主要区别和适用场景?

A: grep用于查找和过滤,sed用于批量编辑和替换,awk用于分析、统计和格式化输出。

Q: 如何用awk统计某列的平均值?

A: awk '{sum+=$2} END {print sum/NR}' file.txt

Q: sed如何只替换每行第一个匹配?

A: 默认只替换第一个,s/old/new/

Q: grep如何递归搜索并显示行号?

A: grep -rn pattern dir/


8. ️ 进阶技巧与最佳实践

  • grep配合正则表达式,支持多模式、上下文搜索
  • sed可用脚本文件批量处理复杂编辑
  • awk支持自定义函数、数组、条件分支,适合复杂报表
  • 三剑客可组合使用:cat file | grep ... | sed ... | awk ...
  • 大文件处理建议用LC_ALL=C提升速度
  • 推荐用rg(ripgrep)等现代工具提升效率
  • awk脚本可用-f参数独立维护,便于复用
  • sed/awk处理大文件时建议分批处理,避免内存溢出

9. 三剑客组合实战

9.1 日志过滤+批量替换+统计

cat app.log | grep 'ERROR' | sed 's/ERROR/ERR/g' | awk '{count++} END{print "总错误行数:",count}'

9.2 复杂数据清洗

cat data.csv | grep -v '^#' | sed '/^$/d' | awk -F ',' '{if($3>80) print $1,$3}'

9.3 批量提取、格式化与汇总

find . -name '*.log' | xargs grep 'timeout' | awk -F ':' '{print $1}' | sort | uniq -c | sort -nr

10. 常见错误与排查建议

  • grep无结果时,检查正则是否转义、文件编码是否一致。
  • sed替换无效,检查分隔符、正则、-i参数是否正确。
  • awk输出异常,检查分隔符、字段引用、脚本语法。
  • 组合命令时,建议分步调试,逐步定位问题。
  • 大文件处理建议用head/tail/less预览,避免全量加载。

总结:
Linux文本处理三剑客各有专长,合理组合可高效完成日志分析、批量替换、数据统计等任务。多练习、多组合,成为文本处理高手!

你可能感兴趣的:(Linux文本处理三剑客实战指南:grep、sed、awk)