Linux 文本处理三剑客详解

1. grep - 文本搜索工具

1.1 核心功能

用于在文件中搜索匹配正则表达式的行

1.2 常用参数详解

参数 作用 示例
-c 只显示匹配行的计数 grep -c "error" log.txt
-v 反向选择(显示不匹配的行) grep -v "success" data.txt
-l 只显示包含匹配项的文件名 grep -l "TODO" *.py
-h 显示匹配内容时不显示文件名 grep -h "warning" *.log
-r 递归搜索子目录 grep -r "function" /src/
-i 忽略大小写 grep -i "hello" file.txt
-q 静默模式(不输出,用$?判断) grep -q "found" file && echo "Exist"
-E 使用扩展正则(等价egrep) `grep -E “a
-A n 显示匹配行后n行 grep -A 2 "error" log
-B n 显示匹配行前n行 grep -B 1 "critical" log

1.3 经典示例

# 统计所有.py文件中"import"出现的总次数
grep -c "import" *.py | awk -F: '{sum+=$2} END{print sum}'

# 查找非注释的PHP代码(排除以//或#开头的行)
grep -v -E '^\s*(//|#)' script.php

# 递归搜索并只显示文件名
grep -rl "deprecated" /project/

2. sed - 流编辑器

2.1 核心功能

对文本进行流式编辑(查找/替换/删除/插入)

2.2 模式匹配与替换

基本语法

sed 's/pattern/replacement/flags'
标志 作用
g 全局替换(默认每行只替换第一个)
i 忽略大小写
p 打印修改过的行

经典示例

# 将所有的"colour"替换为"color"(忽略大小写)
sed 's/colour/color/gi' file.txt

# 替换每行第二个"cat"为"dog"
sed 's/cat/dog/2' animals.txt

# 删除HTML标签
sed 's/<[^>]*>//g' page.html

2.3 行号定位

# 操作特定行
sed '5s/old/new/' file      # 只替换第5行
sed '10,20d' file           # 删除10-20行
sed '/start/,/end/d' file   # 删除两个模式间的所有行

# 特殊行号标记
sed '$s/old/new/' file      # 只替换最后一行
sed '1~2d' file             # 删除所有奇数行(从第1行开始,步长2)

2.4 原地修改(-i参数)

# 危险操作!会直接修改原文件
sed -i 's/foo/bar/g' file.txt

# 安全做法:先备份原文件
sed -i.bak 's/foo/bar/g' file.txt  # 生成file.txt.bak备份

# 只处理匹配行(这里处理包含"error"的行)
sed -i '/error/s/warning/CRITICAL/' log.txt

2.5 高级技巧

# 多重命令(用分号分隔)
sed 's/foo/bar/; s/hello/world/' file

# 引用匹配内容(&表示匹配的整个内容)
sed 's/[0-9]\+/[&]/g' file  # 将所有数字用[]包裹

# 使用其他分隔符(避免转义/)
sed 's|/usr/local|/usr|g' paths.txt

3. awk - 文本分析工具

3.1 核心结构

awk 'BEGIN{初始化} 模式{动作} END{收尾}' 文件

3.2 BEGIN和END用法

BEGIN示例

# 计算CSV文件的总行数(不读文件内容)
awk 'BEGIN{print "Start Processing"} {count++} END{print "Total lines:", count}' data.csv

# 设置字段分隔符(处理冒号分隔文件)
awk 'BEGIN{FS=":"} {print $1}' /etc/passwd

END示例

# 统计文件总字符数
awk '{len+=length($0)} END{print "Total chars:", len}' file

# 计算平均值
awk '{sum+=$3} END{printf "Avg: %.2f\n", sum/NR}' data.txt

3.3 字段处理

# 打印第一列和最后一列($NF表示最后一列)
awk '{print $1, $NF}' table.txt

# 条件过滤(显示第3列大于100的行)
awk '$3 > 100 {print $0}' data.txt

# 字段重新计算(将KB转为MB)
awk '{$3=$3/1024; print $0}' size_report.txt

3.4 内置变量

变量 含义 示例
NR 当前行号 awk 'NR>5 {print}' # 跳过前5行
NF 当前行的字段数 awk '{print NF}' # 每行列数
FS 输入字段分隔符 awk 'BEGIN{FS=":"} {...}'
OFS 输出字段分隔符 awk 'BEGIN{OFS="\t"} {...}'

3.5 实战案例

# 分析Nginx访问日志(统计IP访问次数)
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log | sort -nrk2

# 处理CSV并计算(求第2列大于均值的行)
awk -F, 'NR==1 {header=$0; next} {sum+=$2; data[NR]=$0} END{avg=sum/(NR-1); print header; for(i=2;i<=NR;i++) if($2>avg) print data[i]}' data.csv

# 格式化输出(对齐列)
awk '{printf "%-20s %10d\n", $1, $3}' sales.txt

三剑客对比总结

工具 最佳场景 核心优势
grep 快速搜索 简单高效的正则匹配
sed 流式编辑 正则替换/行号操作
awk 数据分析 字段处理/统计计算

黄金组合
grep 过滤 → sed 编辑 → awk 分析

作者:admin  创建时间:2025-05-29 09:50
最后编辑:admin  更新时间:2025-05-29 13:26