4、核心Applet解析(上):文件管理类(ls, cp, mv, rm)、文本处理类(cat, grep, sed, awk)

各位同学,咱们今天来啃硬骨头。

BusyBox 里最常用的 Applet,说白了就是两大类:文件管理和文本处理。你想想看,嵌入式系统里没有图形界面,所有操作都靠命令行。文件要拷贝、要删除、要改名,日志要查看、要搜索、要过滤——这些活儿全得靠这几个命令。

我个人习惯,先把最核心的八个命令讲透。它们分别是:ls、cp、mv、rm,以及 cat、grep、sed、awk。嗯,这里要注意,BusyBox 版本的这些命令和桌面 Linux 的 GNU 版本有差异,很多高级选项被砍掉了。咱们得搞清楚哪些能用,哪些不能用。

核心原则:BusyBox 的 Applet 追求的是「够用就好」。它不会给你全套 GNU 工具链,但保证你日常开发不卡壳。

4.1 文件管理类:ls、cp、mv、rm

文件管理是嵌入式开发的日常。我刚开始做嵌入式那会儿,最痛苦的就是在只有 2MB Flash 的板子上,发现 ls 居然不支持 --color 参数。嗯,后来才明白,BusyBox 的 ls 默认编译时就没开颜色支持。

4.1.1 ls —— 列出目录内容

ls 是最常用的命令,没有之一。BusyBox 的 ls 支持以下常用选项:

选项 功能 BusyBox 是否支持
-l 长格式显示(权限、大小、时间) ✅ 支持
-a 显示隐藏文件(以 . 开头的文件) ✅ 支持
-h 人类可读的大小(K、M、G) ✅ 支持
-R 递归列出子目录 ✅ 支持
--color 彩色输出 ❌ 默认不编译

我在项目中遇到过一个问题:用 ls -l 查看文件大小,发现全是字节数,根本看不出来是几兆。后来加上了 -h 参数,瞬间清爽。你想想看,一个 1048576 字节的文件,和显示为 1.0M,哪个更直观?

避坑指南:我曾经在裁剪 BusyBox 时,为了省空间把 ls 的 -l 选项给关了。结果调试时看不到文件权限,排查问题花了整整一下午。从此以后,ls 的 -l 和 -a 我必留。

4.1.2 cp —— 复制文件或目录

cp 命令在嵌入式环境里有个坑:默认情况下,BusyBox 的 cp 不支持 -a(归档模式)选项。你需要用 -dR --preserve=all 来替代。

常用选项:

  • -r 或 -R:递归复制目录
  • -f:强制覆盖,不提示
  • -v:显示复制过程(调试时很有用)
  • -p:保留文件属性(时间戳、权限)

举个例子,复制整个 /etc 目录到备份目录:

# BusyBox 环境下的目录复制
cp -r /etc /backup/etc_backup

# 如果要保留权限和时间戳
cp -rp /etc /backup/etc_backup

注意:BusyBox 的 cp 默认不会复制符号链接本身,而是复制链接指向的文件。如果你需要复制链接,记得编译时开启 CONFIG_CP_DEREFERENCE 选项。

4.1.3 mv —— 移动或重命名文件

mv 相对简单,BusyBox 的实现和 GNU 版本差异不大。唯一要注意的是:跨文件系统移动时,BusyBox 的 mv 实际上是先 cp 再 rm,速度会慢一些。

我个人习惯用 mv -v 来确认操作是否成功:

# 重命名文件
mv -v old_name.c new_name.c

# 移动目录到另一个位置
mv -v /tmp/logs /var/log/

4.1.4 rm —— 删除文件或目录

这个命令要特别小心。嵌入式系统里没有回收站,rm 删了就真没了。

常用选项:

  • -r:递归删除目录及其内容
  • -f:强制删除,不提示
  • -v:显示删除过程

血的教训:我曾经在调试脚本时,写了一句 rm -rf /tmp/*,结果变量没展开,变成了 rm -rf /*。嗯,那台开发板直接变砖了。从此以后,我写 rm -rf 之前都会先 echo 一遍确认路径。

4.2 文本处理类:cat、grep、sed、awk

嵌入式系统里,日志分析、配置文件修改、数据提取,全得靠这几个命令。它们就像瑞士军刀,小巧但锋利。

4.2.1 cat —— 连接文件并输出

cat 是最简单的文本工具,但 BusyBox 版本有个隐藏功能:-n 选项可以显示行号,调试配置文件时特别好用。

# 查看配置文件并显示行号
cat -n /etc/inittab

# 合并多个日志文件
cat log1.log log2.log > combined.log

你想想看,一个几百行的配置文件,没有行号,你怎么定位问题?cat -n 配合 grep 简直是黄金搭档。

4.2.2 grep —— 文本搜索利器

grep 是嵌入式调试的必备工具。BusyBox 的 grep 支持基本正则表达式,但 -P(Perl 正则)通常不支持。

常用选项:

选项 功能 使用场景
-i 忽略大小写 搜索日志时忽略大小写差异
-r 递归搜索目录 在 /var/log 下搜索所有日志
-v 反向匹配(排除) 过滤掉注释行
-n 显示匹配行号 定位代码问题
-c 只统计匹配行数 快速统计错误次数

举个例子,排查系统启动时的错误:

# 在系统日志中搜索 error,忽略大小写,显示行号
grep -in "error" /var/log/messages

# 统计某个进程崩溃的次数
grep -c "crash" /var/log/syslog

我的经验:调试网络问题时,我经常用 grep -v "^#" 来过滤配置文件中的注释行,只看有效配置。这个技巧在排查 /etc/network/interfaces 时特别管用。

4.2.3 sed —— 流编辑器

sed 是文本替换的利器。BusyBox 的 sed 支持基本的替换操作,但 -i(原地编辑)选项需要编译时开启。

常用操作:

  • s/旧文本/新文本/:替换文本
  • /模式/d:删除匹配行
  • n,m:指定行范围

实际案例:修改配置文件中的 IP 地址:

# 将配置文件中的 192.168.1.100 替换为 192.168.1.200
sed -i 's/192.168.1.100/192.168.1.200/g' /etc/network/config

# 删除配置文件中的注释行
sed -i '/^#/d' /etc/network/config

注意:BusyBox 的 sed 不支持 -E(扩展正则表达式),如果你需要复杂的正则匹配,建议用 awk 替代。

4.2.4 awk —— 文本分析神器

awk 是文本处理的大杀器。BusyBox 的 awk 是简化版,但日常够用。它支持字段分割、条件判断、循环等基本功能。

核心概念:

  • $0:整行内容
  • $1、$2...:第 1、2... 个字段
  • NF:当前行的字段数
  • NR:当前行号

举个例子,分析 /proc/meminfo 提取关键信息:

# 提取内存总量和可用内存
awk '/MemTotal/ {print "总内存:", $2/1024, "MB"}
     /MemAvailable/ {print "可用内存:", $2/1024, "MB"}' /proc/meminfo

再比如,分析日志中某个接口的流量:

# 假设日志格式:时间 接口 发送字节 接收字节
# 提取 eth0 的总发送流量
grep "eth0" /var/log/traffic.log | awk '{sum += $3} END {print "总发送:", sum, "字节"}'

核心技巧:我个人习惯把 grep 和 awk 组合使用。grep 负责筛选行,awk 负责提取列。这个组合能解决 90% 的文本处理需求。

4.3 本章知识体系

为了让你更直观地理解这些 Applet 的关系,我画了一张图:

BusyBox 核心 Applet 知识体系 文件管理类 ls 列出目录内容 cp 复制文件/目录 mv 移动/重命名 rm 删除文件/目录 文本处理类 cat 连接并输出文件 grep 文本搜索 sed 流编辑器(替换) awk 文本分析神器 组合使用 提示:文件管理类负责操作文件本身,文本处理类负责操作文件内容

这张图很清楚地展示了两个阵营的分工。文件管理类负责「文件本身」的操作——创建、删除、移动、复制。文本处理类负责「文件内容」的操作——查看、搜索、替换、分析。两者配合,能覆盖嵌入式开发中 95% 的文件操作需求。

我的建议:刚开始学 BusyBox 裁剪时,不要贪多。先把这八个命令的常用选项记熟,遇到问题知道用什么工具。等你用顺手了,再去研究那些冷门选项。

好了,这一章的内容就到这里。记住,工具是死的,人是活的。多动手、多实践,这些命令会成为你嵌入式开发路上的得力助手。

可可精品资料库