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
最后编辑:admin 更新时间:2025-05-29 13:26