1. 为什么需要掌握ex命令?
在Linux系统日常工作中,文本编辑是最基础也最频繁的操作之一。作为vi编辑器的底层命令集,ex命令提供了比常规vi模式更精确的文本控制能力。很多新手在遇到以下场景时会束手无策:
- 需要批量修改500个分散在不同行的特定字符串
- 要对日志文件进行条件化删除(如保留含"error"的行)
- 在脚本中自动化执行编辑操作
这些正是ex命令的用武之地。与可视化编辑不同,ex采用行编辑模式,通过命令组合能实现复杂文本处理。我在服务器维护中就经常用它快速清理日志、批量更新配置文件,效率比手动编辑高出十倍不止。
2. ex命令基础环境准备
2.1 启动ex编辑器
直接执行ex 文件名进入ex模式,但更实用的方式是在vi中切换:
vi test.txt # 进入vi编辑器 : # 输入冒号进入ex命令模式2.2 模式区分要点
- 命令模式:输入
:后进入,光标移动到屏幕底部 - 插入模式:输入
i/a/o等命令进入(与vi相同) - 可视模式:按
v/V/Ctrl+v选择文本(与vi相同)
提示:在命令模式下按
Ctrl+c可取消当前输入的命令
3. 核心编辑命令详解
3.1 行号定位与跳转
:3 # 跳转到第3行 :$ # 跳转到文件末尾 :.,+5 # 选中当前行到其后5行 :% # 全文件范围(相当于1,$)3.2 文本增删改查
:10,20d # 删除10-20行 :g/pattern/d # 删除所有匹配pattern的行 :3,8s/old/new/g # 替换3-8行的old为new :r !date # 插入系统日期(实用技巧)3.3 高级模式组合
:g/^#/d # 删除所有注释行(以#开头) :v/error/d # 删除所有不含error的行(反向选择) :10,20w newfile # 将10-20行写入新文件4. 实战案例解析
4.1 日志文件处理
假设有nginx日志access.log,需要提取特定IP的请求:
:g/192.168.1.100/p # 打印该IP所有记录 :v/GET/d # 删除非GET请求 :1,$!sort -u # 全文件去重排序4.2 配置文件批量修改
修改SSH配置时,需要注释掉特定参数:
:g/^PermitRootLogin/s/^/#/ # 注释所有PermitRootLogin :%s/#Port 22/Port 2222/ # 修改默认端口5. 避坑指南与技巧
5.1 常见错误处理
- 误删恢复:输入
:e!放弃修改重新加载 - 范围错误:先使用
:1,10p预览再操作 - 模式混淆:注意提示符
:和/的区别
5.2 效率提升技巧
:@: # 重复上条ex命令 :^R " # 粘贴系统剪贴板内容 :set nu # 显示行号(排查时必备)6. 与sed/awk的对比选择
虽然sed/awk也能完成类似操作,但ex的优势在于:
- 交互式即时反馈
- 可结合vi可视化选择
- 无需退出编辑器即可执行shell命令(
:!cmd)
建议使用场景:
- 简单编辑:vi普通模式
- 复杂批处理:ex命令模式
- 超大数据文件:sed/awk流处理
我在处理500MB以上日志文件时,会先用grep -n定位关键行号,再用ex精确编辑,比直接vim打开更节省内存。