BusyBox 文本处理 grep sed awk 的简化实现
文本三剑客对比
BusyBox 提供了 grep、sed、awk 的精简实现,行为与 GNU 原版基本兼容,但砍掉了一些高级特性:
| 工具 | BusyBox 版 | GNU 版 | 体积 |
|---|---|---|---|
| grep | 基础正则 + 扩展正则 | 基础/扩展/PCRE 三种模式 | ~40KB |
| sed | 基础替换/删除/插入 | 完整 POSIX + 很多扩展命令 | ~50KB |
| awk | mawk 简化版 | gawk(完整 AWK 语言) | ~80KB |
grep 常用模式
BusyBox grep 覆盖了最常用的场景:
# 基础字符串搜索
busybox grep "pattern" file.txt
# 忽略大小写
busybox grep -i "pattern" file.txt
# 显示匹配行的行号
busybox grep -n "pattern" file.txt
# 只显示匹配的文件名
busybox grep -l "pattern" *.txt
# 反向匹配(不包含 pattern 的行)
busybox grep -v "pattern" file.txt
# 正则匹配(扩展正则用 -E)
busybox grep -E "^[0-9]+" file.txt
# 搜索并替换(用 xargs + sed 组合)
busybox grep -rl "old" /path | busybox xargs busybox sed -i 's/old/new/g'
BusyBox grep 不支持:
- PCRE 正则(
-P) - 固定字符串模式(
-F,某些版本不支持) -A/-B/-C上下文行(部分版本支持,测试一下)
sed 替换和删除
sed 是 BusyBox 文本处理中变化最小的工具之一:
# 基本替换
busybox sed 's/old/new/g' file.txt
# 只替换第一个匹配
busybox sed 's/old/new/' file.txt
# 在行首添加内容
busybox sed 's/^/prefix /' file.txt
# 在行尾添加内容
busybox sed 's/$/ suffix/' file.txt
# 删除匹配行
busybox sed '/pattern/d' file.txt
# 原地修改(某些版本需要显式 -i 参数)
busybox sed -i 's/old/new/g' config.conf
BusyBox sed 不支持:
\u、\L、\U等大小写转换替换语法- 地址范围的某些高级特性
- 多行模式(N、D、P 命令)
awk 数值和字段处理
BusyBox awk(基于 mawk 的简化版)足够做数值计算和字段处理:
# 提取第 N 列(默认分隔符是空白)
busybox awk '{print $2}' data.txt
# 自定义分隔符
busybox awk -F: '{print $1}' /etc/passwd
# 条件过滤
busybox awk '$3 > 100 {print $1, $3}' data.txt
# 数值计算
busybox awk '{sum += $2} END {print "Total:", sum}' data.txt
# 多文件处理
busybox awk '{count[$1]++} END {for (k in count) print k, count[k]}' file1 file2
BusyBox awk 不支持:
- 用户自定义函数
- 多维数组
- 复杂的正则表达式匹配
- gawk 特有的内建函数(如
gensub()、asort())
实用替代技巧
在 BusyBox 环境里遇到文本处理高级需求时,几个常用替代思路:
grep -A/-B 没有:用 awk 实现上下文行
# 等价于 grep -A 2 -B 2 "pattern" file
busybox awk 'c > 0 {print; c--} /pattern/ {print; c = 2}' file
sed 复杂替换没有:用 perl(如果系统装了)或 python,或者在主机上处理好文件再传到设备。BusyBox 环境装 perl 代价很大(几百 KB),一般不值得。
awk 用户函数没有:把重复逻辑提取成 Shell 函数,逐行处理:
#!/bin/sh
process_line() {
echo "$1" | busybox awk -F: '{print $1}'
}
while IFS= read -r line; do
process_line "$line"
done < data.txt