一、grep:文本搜索工具
1. 核心参数与用法
grep [选项] "模式" 文件名
参数 | 作用 | 示例 |
---|
-i | 忽略大小写 | grep -i "error" log.txt |
-v | 反向匹配(排除匹配行) | grep -v "#" config.ini |
-n | 显示匹配行的行号 | grep -n "warning" debug.log |
-o | 仅显示匹配内容(不输出整行) | grep -oP "\d{3}-\d{4}" contacts.txt |
-A 3 | 显示匹配行后3行 | grep -A 3 "panic" kernel.log |
-B 2 | 显示匹配行前2行 | grep -B 2 "Connection refused" app.log |
-E | 启用扩展正则表达式(支持 + ` | ` 等) |
2. 正则表达式详解
符号 | 功能 | 示例 |
---|
^ | 匹配行首 | grep "^root" /etc/passwd |
$ | 匹配行尾 | grep "bash$" /etc/passwd |
. | 匹配任意一个字符 | grep "a.c" file.txt → 匹配 abc , a1c 等 |
* | 匹配前一个字符0次或多次 | grep "go*d" file.txt → 匹配 gd , good 等 |
[] | 匹配括号内任意字符 | grep "[aeiou]" file.txt → 匹配含元音的行 |
[^] | 排除括号内字符 | grep "[^0-9]" file.txt → 匹配非纯数字的行 |
\ | 转义特殊字符 | grep "\.log$" files.txt → 匹配以 .log 结尾的行 |
3. 示例
示例1:查找含 mysql
用户的行并显示行号
grep -n "mysql" /etc/passwd
# 输出:49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
-n
:显示行号"mysql"
:匹配模式(区分大小写)
示例2:统计日志中 404
和 500
错误次数
grep -E " 404 | 500 " access.log | wc -l
二、sed:流编辑器
1. 核心参数与用法
sed [选项] '命令' 文件名
参数 | 作用 | 示例 |
---|
-i | 直接修改文件(需谨慎) | sed -i.bak 's/old/new/g' file.txt |
-n | 静默模式(仅输出处理后的行) | sed -n '3p' data.txt → 仅打印第3行 |
-e | 执行多条命令 | sed -e '1d' -e 's/foo/bar/' input.txt |
2. 常用命令与正则表达式
命令 | 功能 | 示例 |
---|
s/old/new/g | 全局替换文本 | sed 's/foo/bar/g' file.txt |
d | 删除匹配行 | sed '/^$/d' file.txt → 删除空行 |
p | 打印行(需结合 -n 使用) | sed -n '/error/p' log.txt |
a\text | 在行后追加文本 | sed '3a\---分割线---' data.txt |
3. 实战示例
示例1:批量替换文件中的日期格式(YYYY-MM-DD → DD/MM/YYYY)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' dates.txt
-
-E
:启用扩展正则表达式
-
():捕获组,\1\2\3引用分组内容
示例2:删除空行并压缩多个空格
sed -e '/^$/d' -e 's/ \+/ /g' text.txt
三、awk:文本处理与报表生成
1. 核心参数与用法
awk [选项] '模式 {动作}' 文件名
参数 | 作用 | 示例 |
---|
-F: | 指定字段分隔符(冒号) | awk -F: '{print $1}' /etc/passwd |
-v | 定义变量 | awk -v threshold=100 '$3 > threshold' data.csv |
2. 内置变量与正则表达式
变量 | 功能 | 示例 |
---|
NR | 当前行号 | awk 'NR==2' file.txt → 输出第2行 |
NF | 当前行的字段数 | awk '{print $NF}' log.txt → 输出最后一个字段 |
~ | 正则匹配 | awk '$1 ~ /^192\.168/ {print}' access.log |
3. 实战示例
示例1:统计 CSV 文件中各分类的销售额
awk -F, '{sum[$2] += $3} END {for (k in sum) print k, sum[k]}' sales.csv
-
sum[$2]
:按第2列分类累计销售额
-
END:处理完所有行后执行
示例2:提取 IP 地址访问次数前5名
awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log | sort -nrk2 | head -5
-
ip[$1]++
:统计每个 IP 出现次数
-
sort -nrk2:按次数降序排列
工具 | 核心场景 | 正则表达式支持 | 适用场景 |
---|
grep | 快速搜索文本 | 基础/扩展正则 | 日志过滤、关键词统计 |
sed | 行级文本编辑 | 基础正则(需 -E 扩展) | 批量替换、删除空行、格式化文本 |
awk | 列处理与复杂计算 | 扩展正则(类似 Perl) | 数据报表、字段统计、结构化文本处理 |