命令是干什么的
colrm 从标准输入读文本,按字符列删除指定区间,再把结果写到标准输出。它来自 util-linux,定位是快速裁掉固定宽度报表的前后缀列。按列处理的特性决定了它只适合列宽固定的纯文本:列号从 1 开始,只给起始列表示一直删到行尾,给两个列号则删除含首含尾的闭区间。列宽不固定或按字段分隔的文本,用 cut 与 awk 更合适。
基本信息
| 适用平台 | Linux 与类 Unix,属于 util-linux,主流发行版默认自带 |
|---|---|
| 语法 | colrm 起始列 [结束列],数据只能从标准输入进来 |
| 参数说明 | 没有任何选项,也不接受文件名参数,必须用重定向或管道喂数据 |
| 列号规则 | 从 1 开始计数,两个列号构成闭区间,含首含尾 |
| 等价写法 | 删除某列之后用 cut -c 1-列号减一;只保留区间用 cut -c 起-止 |
| 输出 | 只写标准输出,不修改源文件 |
典型使用场景
- 处理固定宽度报表:删掉开头的序号列或结尾的合计列
- 老脚本改写:把绕的按列截断换成更直白的写法
- 日志格式转换:去掉每行固定宽度的前缀字段
- 与 expand 组合处理含制表符的表格,先统一列宽再裁剪
- 快速预览某列之后的内容,避免把整行贴进编辑器处理
- 一次性取数:不值得为一次裁剪专门写 awk 表达式
常用示例
常用示例
colrm 1 10 < fixed-width.txt # 删除每行第 1 到第 10 列
colrm 40 < report.txt # 删除第 40 列起的全部内容,等于保留前 39 列
expand -t 8 raw.txt | colrm 1 12 # 先把 Tab 展开成空格,列号才能与视觉对齐
cat report.txt | colrm 40 # 从管道读也一样,colrm 只吃标准输入
cut -c 11- fixed-width.txt # 等价写法:保留第 11 列起
awk '{print substr($0,11)}' fixed-width.txt # 改成 awk,逻辑更灵活
colrm 1 10 < in.txt | head -3 # 先看前几行,确认裁剪结果符合预期常见需求与写法对照
| 需求 | colrm 写法 | 更常用的替代写法 |
|---|---|---|
| 删掉第 1 到 10 列 | colrm 1 10 | cut -c 11- 保留第 11 列起 |
| 删掉第 40 列起的全部 | colrm 40 | cut -c 1-39 保留前 39 列 |
| 只保留第 5 到 20 列 | 做不到,colrm 只会删 | cut -c 5-20 |
| 删除中间一段 | colrm 10 20 | cut -c 1-9,21- 用逗号拼区间 |
| 按字段而不是按列切分 | 不适用 | cut -d 分隔符 -f 字段号,或 awk |
列计数按字符走,汉字与全角标点这些宽字符的计数和屏幕显示宽度不一致,处理中文文本时要格外小心,很容易把字截成乱码。
含制表符的文本先用 expand 把 Tab 换成空格,否则命令列号与实际看到的栏位对不上,这是最常见的误用场景。
不带任何参数直接运行 colrm 会停在那里等键盘输入,直到按下结束符才输出,这是按标准输入工作的正常行为,不是卡死。