column 命令详解与参数实测(Ubuntu 22.04)
column 详解:-t 成表、-s/-o 分隔符、-N 列名、-J JSON 输出与 passwd 表格化,Ubuntu 22.04 实测
column 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 column 的每一个常用参数——默认多列填充、
-t表格对齐、-s输入分隔符、-o输出分隔符、-c输出宽度、-x行优先填充、-N自定义列名、-d隐藏表头、-n+-JJSON 输出、-R右对齐与-H隐藏列,并实测确认其由 bsdextrautils 包提供,全部命令与回显已在 Ubuntu 22.04(util-linux 2.37.2)实测通过。
一、环境信息
本篇所有命令与回显均在以下环境实测采集,读者在同等版本环境可逐条复现。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- column 版本:column from util-linux 2.37.2(
column --version实测),由 bsdextrautils 包提供(dpkg -S实测),Ubuntu 22.04 默认预装,无需额外安装 - 演示目录:
/root/demo/column/ - 测试数据:
passwd5.txt(/etc/passwd 前 5 行)、score.txt(空格分隔成绩单)、people.csv(逗号分隔)、grid.txt(12 个单词按 4 行排布,演示填充方向)
二、命令概览
column 的职责是把零散的文本行整理成整齐的列或表格:不带 -t 时按终端宽度把多行内容重排成多栏(类似 ls 的多列输出);带 -t 时按分隔符把每行切成字段并按最宽字段对齐成表,是格式化 /etc/passwd、CSV、进程清单输出的利器。
💡 技术拓展:文本对齐成表的常用工具对比——
工具 特点 适用场景 column -t 按最宽字段自动对齐,零学习成本 快速看表格化输出 awk printf 手工控制每列宽度与对齐方向 固定格式的报表生成 sed -e 's/,/\t/g' 换 tab 依赖编辑器/终端的 tab 宽度 临时粗看 paste + expand 合并文件后按 tab 展开为列 多文件按列合并 本文以 column 为例,它无需写格式串即可对齐任意分隔符文本,交互探查效率最高。
2.1 语法与测试数据准备
column 的语法为 column [options] [<file>...](源自 --help 原文),不给文件时读标准输入。准备四类演示数据:
mkdir -p /root/demo/column
cd /root/demo/column
head -5 /etc/passwd > passwd5.txt
printf 'NAME SCORE GRADE\nalice 92 A\nbob 85 B\ncarol 78 C\n' > score.txt
printf 'name,city,age\nalice,Beijing,30\nbob,Shanghai,25\n' > people.csv
printf 'one two three\nfour five six\nseven eight nine\nten eleven twelve\n' > grid.txt
ls -l passwd5.txt score.txt people.csv grid.txt
数据就绪回显:
-rw-r--r-- 1 root root 63 Oct 15 07:42 grid.txt
-rw-r--r-- 1 root root 189 Oct 15 07:42 passwd5.txt
-rw-r--r-- 1 root root 47 Oct 15 07:42 people.csv
-rw-r--r-- 1 root root 48 Oct 15 07:42 score.txt
2.2 --help 全量回显
column --help 输出完整保留。注意与部分老资料不同:本版本的 -n 是 --table-name(JSON 表名)、-N 是 --table-columns(列名清单),-d 是 --table-noheadings:
Usage:
column [options] [<file>...]
Columnate lists.
Options:
-t, --table create a table
-n, --table-name <name> table name for JSON output
-O, --table-order <columns> specify order of output columns
-N, --table-columns <names> comma separated columns names
-l, --table-columns-limit <num> maximal number of input columns
-E, --table-noextreme <columns> don't count long text from the columns to column width
-d, --table-noheadings don't print header
-e, --table-header-repeat repeat header for each page
-H, --table-hide <columns> don't print the columns
-R, --table-right <columns> right align text in these columns
-T, --table-truncate <columns> truncate text in the columns when necessary
-W, --table-wrap <columns> wrap text in the columns when necessary
-L, --keep-empty-lines don't ignore empty lines
-J, --json use JSON output format for table
-r, --tree <column> column to use tree-like output for the table
-i, --tree-id <column> line ID to specify child-parent relation
-p, --tree-parent <column> parent to specify child-parent relation
-c, --output-width <width> width of output in number of characters
-o, --output-separator <string> columns separator for table output (default is two spaces)
-s, --separator <string> possible table delimiters
-x, --fillrows fill rows before columns
-h, --help display this help
-V, --version display version
For more details see column(1).
2.3 版本确认与包归属
$ column --version
column from util-linux 2.37.2
$ dpkg -S /usr/bin/column
bsdextrautils: /usr/bin/column
$ readlink -f /usr/bin/column
/usr/bin/column
说明:Ubuntu 22.04 的 column 由 bsdextrautils 包提供(与 hexdump 同包),column --version 的版本号即 util-linux 版本。
三、参数逐项实测
3.1 默认行为:按空白分列、列优先填充
$ column grid.txt
one two three seven eight nine
four five six ten eleven twelve
说明:不带参数时,column 把输入的每一行当作一个条目,按「先填满一列再填下一列」的方向重排进终端宽度(本环境 80 列,每栏够放 3 个词所以分 2 栏 4 条目)。输出中的宽间隔是制表符填充。这与 ls 的多列排列方式一致。
3.2 -t(--table):按最宽字段对齐成表
$ column -t score.txt
NAME SCORE GRADE
alice 92 A
bob 85 B
carol 78 C
$ column -t grid.txt
one two three
four five six
seven eight nine
ten eleven twelve
说明:-t 是日常最常用的模式——按空白把每行切分,整列宽度取该列最长字段加两空格。对比 3.1:-t 保留每行的字段结构(4 行进 4 行出),默认模式则是重排换位。
💡 提示:
-t是column的招牌参数——mount、lsblk等命令的表格化输出本质都是-t的功劳;管道里把任意空白分隔的输出对齐成表,一条column -t即可。
3.3 -x(--fillrows):行优先填充
$ column -x grid.txt
one two three four five six seven eight nine
ten eleven twelve
说明:-x 把填充方向改为「先填满一行再换下一行」。对比 3.1 的输出顺序:默认列优先时第 1 栏依次是 one/four、第 2 栏是 seven/ten;-x 行优先时 one/two/three 保持同一行。阅读习惯类似书籍排版时用 -x。
3.4 -s(--separator):指定输入分隔符
$ column -t -s, people.csv
name city age
alice Beijing 30
bob Shanghai 25
$ column -t -s: passwd5.txt
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
bin x 2 2 bin /bin /usr/sbin/nologin
sys x 3 3 sys /dev /usr/sbin/nologin
sync x 4 65534 sync /bin /bin/sync
说明:-s 指定输入字段的分隔字符(可以是多个字符的集合,命中任一字符都切分)。-s: 解析 /etc/passwd 是 column 最经典的用法。注意 -s 只在 -t 表格模式下有意义。
3.5 -o(--output-separator):指定输出分隔符
$ column -t -s: -o ' | ' passwd5.txt
root | x | 0 | 0 | root | /root | /bin/bash
daemon | x | 1 | 1 | daemon | /usr/sbin | /usr/sbin/nologin
bin | x | 2 | 2 | bin | /bin | /usr/sbin/nologin
sys | x | 3 | 3 | sys | /dev | /usr/sbin/nologin
sync | x | 4 | 65534 | sync | /bin | /bin/sync
$ column -t -s, -o '@' people.csv
name @city @age
alice@Beijing @30
bob @Shanghai@25
说明:-o 替换列间填充(默认两个空格,见 2.2 节 help 原文)。第二个例子可见 -o '@' 时列宽只按「内容 + 分隔符」计算,alice@Beijing 之间因 alice 列无需补齐而紧贴——-o 是替换填充而非追加。
3.6 -c(--output-width):限制输出宽度
先看 -t 模式:表格总宽 19 字符小于 30,-c 30 不产生任何变化(它是上限而非强制值):
$ column -t -s, -c 30 people.csv
name city age
alice Beijing 30
bob Shanghai 25
默认(非 -t)多栏模式下 -c 的效果最直观——8 行单词在 24 列宽度内重排为 3 行(列间以制表符填充,下例中行首词与后续词的宽间隔即 tab 字符):
$ printf "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n" | column -c 24
one four seven
two five eight
three six
说明:-c 指定输出宽度(字符数,默认取终端宽度;管道中无终端时取 80)。多栏模式下超宽会导致栏数减少;-t 模式下内容超宽的列需要配合 -T(截断)或 -W(折行)处理(见 2.2 节 help 原文)。
3.7 -N(--table-columns)与 -d(--table-noheadings)
-N 用逗号清单给各列命名,命名的首行成为表头:
$ column -t -s: -N 'user,pass,uid,gid,gecos,home,shell' passwd5.txt
user pass uid gid gecos home shell
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
bin x 2 2 bin /bin /usr/sbin/nologin
sys x 3 3 sys /dev /usr/sbin/nologin
sync x 4 65534 sync /bin /bin/sync
-d 不输出表头行(输入首行不被当作表头吃掉,数据行数不变):
$ column -t -s: -N user,pass,uid -d passwd5.txt
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
bin x 2 2 bin /bin /usr/sbin/nologin
sys x 3 3 sys /dev /usr/sbin/nologin
sync x 4 65534 sync /bin /bin/sync
说明:列名(如 user)会被 -H/-R/-O 等按名引用(见 3.9 节),是 JSON 输出的前置条件。-N 给了 3 个名字但输入有 7 列时,其余列不命名、表头只显示前 3 列名字。
3.8 -n(--table-name)与 -J(--json):JSON 输出
-n 为表格命名(JSON 输出的顶层键),-J 切换 JSON 输出格式:
$ column -J -n userinfo -t -s: -N 'user,pass,uid,gid,gecos,home,shell' passwd5.txt
{
"userinfo": [
{
"user": "root",
"pass": "x",
"uid": "0",
"gid": "0",
"gecos": "root",
"home": "/root",
"shell": "/bin/bash"
},{
"user": "daemon",
"pass": "x",
"uid": "1",
"gid": "1",
"gecos": "daemon",
"home": "/usr/sbin",
"shell": "/usr/sbin/nologin"
},{
"user": "bin",
"pass": "x",
"uid": "2",
"gid": "2",
"gecos": "bin",
"home": "/bin",
"shell": "/usr/sbin/nologin"
},{
"user": "sys",
"pass": "x",
"uid": "3",
"gid": "3",
"gecos": "sys",
"home": "/dev",
"shell": "/usr/sbin/nologin"
},{
"user": "sync",
"pass": "x",
"uid": "4",
"gid": "65534",
"gecos": "sync",
"home": "/bin",
"shell": "/bin/sync"
}
]
}
(实测回显完整无省略。)说明:JSON 中所有值都是字符串;若 -N 命名的列数少于实际列数,column 直接报错退出(column: line 2: for JSON the name of the column 4 is required,实测),因此 JSON 模式必须给每一列命名。
3.9 -R(--table-right)右对齐与 -H(--table-hide)隐藏列
数字列右对齐、按列名隐藏 pass 与 gecos 两列:
$ column -t -s: -N user,pass,uid,gid,gecos,home,shell -H pass,gecos -R uid,gid passwd5.txt
user uid gid x home shell
root 0 0 root /root /bin/bash
daemon 1 1 daemon /usr/sbin /usr/sbin/nologin
bin 2 2 bin /bin /usr/sbin/nologin
sys 3 3 sys /dev /usr/sbin/nologin
sync 4 65534 sync /bin /bin/sync
说明:-H pass,gecos 隐藏两列后剩余 5 列(未命名的列以内容首词显示为表头,如 x);-R uid,gid 让两列数字右对齐便于比较大小。参数按列名引用的前提是先用 -N 命名,直接传未定义的名字会报 column: undefined column name 'uid'(实测)。
四、实战示例
以下示例均在本环境实测执行。
4.1 表格化查看 /etc/passwd
$ head -5 /etc/passwd | column -t -s:
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
bin x 2 2 bin /bin /usr/sbin/nologin
sys x 3 3 sys /dev /usr/sbin/nologin
sync x 4 65534 sync /bin /bin/sync
冒号分隔的系统账本一眼可读;配合 -N 还能加表头(见 3.7 节)。
4.2 表格化查看 CSV 并指定输出分隔符
$ column -t -s, -o " | " people.csv
name | city | age
alice | Beijing | 30
bob | Shanghai | 25
处理 Excel 导出的 CSV 时,-s, -o ' | ' 输出可直接粘贴进 Markdown 表格再补一行表头分隔线。
4.3 管道查看 mount/df 等多列输出
$ df -h -P | head -4 | column -t
Filesystem Size Used Avail Use% Mounted on
overlay 786G 481G 271G 64% /
tmpfs 64M 0 64M 0% /dev
shm 64M 0 64M 0% /dev/shm
column -t 按空白切分对齐各列,数字列一目了然;表头 Mounted on 含空格被切成了两列(挂载点落在 Mounted 列),这类「字段内含空格」的表头正是 column 按空白切分的边界情况,mount、ps -eo、ls -l 等空格分隔输出同理可用。
4.4 生成 JSON 供脚本消费
$ column -J -n users -t -s, -N name,city,age people.csv
{
"users": [
{
"name": "name",
"city": "city",
"age": "age"
},{
"name": "alice",
"city": "Beijing",
"age": "30"
},{
"name": "bob",
"city": "Shanghai",
"age": "25"
}
]
}
-J 输出可直接交给 python3 -m json.tool 或 jq 处理;注意首行表头也被当作数据(加 -d 可跳过表头行)。
五、注意事项与常见问题
Q1:column 命令找不到或和别人的行为不一致?
Ubuntu 22.04 的 column 由 bsdextrautils 提供(见 2.3 节实测,缺失时 apt-get install bsdextrautils);不同发行版/版本的 column 功能差异很大——util-linux 2.23 才有 -N/-R/-J 等 table 扩展,老版本只支持 -t/-s/-o/-c/-x,跨环境脚本要先用 column --version 确认。
Q2:字段内容本身带空格怎么办?
-s 的分隔符是字符集合,无法表达「引号包裹的整字段」这类 CSV 引号语义,带引号逗号的字段会被错误切分;严格 CSV 解析请用 Python csv 模块或 csvtool,column 适合「确定无引号歧义」的快速查看。
Q3:column -t 对齐后中文为什么歪了?
column 按字符数(字节展示宽度)计算列宽,中文等多字节字符在部分实现里按字节数而非显示宽度计算,导致对齐偏移;纯英文数据无此问题,混排时建议先转全英文列名或用支持宽字符的版本。
Q4:-c 30 设了宽度为什么表格没变?
-c 是输出宽度上限:内容窄于上限时无变化(见 3.6 节实测);-t 模式下内容超宽时要配合 -T 截断或 -W 折行才会生效。
Q5:JSON 输出报 for JSON the name of the column 4 is required?
-J 要求每一列都有名字,-N 提供的列名数量必须等于实际列数(见 3.8 节说明与实测报错文案);多列的输入(如 /etc/passwd 的 7 列)要给全 7 个名字。
六、参考链接
- column 手册页:
man column(终端内执行,含 table 模式完整选项说明) - util-linux 上游源码库:https://github.com/util-linux/util-linux
- 同包工具 hexdump 的详解见本专栏《hexdump 命令详解与参数实测(Ubuntu 22.04)》