首页/系统/Linux 运维命令速查/colrm 按列删除字符
文本处理77 条

colrm 按列删除字符

删除每行指定列区间(按字符列):老工具,快速裁掉固定宽度报表的前后缀列,数据从 stdin 进。

Linux 运维命令速查系统更新于 2026-10-13

命令是干什么的

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 10cut -c 11- 保留第 11 列起
删掉第 40 列起的全部colrm 40cut -c 1-39 保留前 39 列
只保留第 5 到 20 列做不到,colrm 只会删cut -c 5-20
删除中间一段colrm 10 20cut -c 1-9,21- 用逗号拼区间
按字段而不是按列切分不适用cut -d 分隔符 -f 字段号,或 awk
列计数按字符走,汉字与全角标点这些宽字符的计数和屏幕显示宽度不一致,处理中文文本时要格外小心,很容易把字截成乱码。
含制表符的文本先用 expand 把 Tab 换成空格,否则命令列号与实际看到的栏位对不上,这是最常见的误用场景。
不带任何参数直接运行 colrm 会停在那里等键盘输入,直到按下结束符才输出,这是按标准输入工作的正常行为,不是卡死。

易错点

  • 对中文等多字节字符按列裁剪:列计数与显示宽度不同,容易把汉字从中间切开变成乱码,动手前先确认数据是纯 ASCII 还是含宽字符
  • 忘记重定向或管道:直接敲命令会静默等待输入,脚本里漏了喂数据就会一直挂着不返回
  • 结束列小于起始列:属于非法区间,命令会报错或输出不符合预期,写死列号前先核对报表实际列宽
  • 只保留某区间却分两次删:第一次裁剪后行已经变短,第二次的列号全错,这种需求直接用 cut -c 起-止 表达
  • 把制表符当单列数:未经 expand 的表格列号与视觉列位不一致,裁错位置还以为命令有毛病

数据来源与参考

  • man 1 colrm(util-linux 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌