LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルのターミナル上でCSVCSV [シーエスブイ]Comma-Separated Values。カンマ区切りのデータ形式ファイルや設定ファイル、各種コマンドの出力結果を確認する際、「文字数の違いで列の位置がガタガタにずれて読みにくい」「カンマ区切りやコロン区切りのデータを、ターミナル上で綺麗な表として一覧表示したい」といった場面はよくあります。
この記事では、テキストデータの文字数を自動で計算し、列幅を揃えた表形式(テーブル)や複数列のリストに整形できる column コマンドの使い方を解説します。基本となる -t・-s オプションの組み合わせから、ヘッダー行の付与や右寄せ、JSONJSON [ジェイソン]JavaScript Object Notation。軽量データ交換フォーマット形式への変換といった便利な機能までを具体例とともに紹介します。
この記事を読むことで、column コマンドの仕組みを正しく理解し、日々のログ確認や設定ファイルの閲覧を見やすく効率化できるようになります。
確認した環境
本記事で解説するコマンドや出力結果は、以下の環境で実機検証を行っています(バージョン確認コマンド: column --version)。
| OSOS [オーエス]Operating System。基本ソフトウェア | パッケージ・バージョン |
|---|---|
| DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューション GNU/Linux 11 (bullseye) | util-linux 2.36.1(column from util-linux 2.36.1) |
| UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS | util-linux 2.39.3(column from util-linux 2.39.3) |
| AlmaLinux 9.4 | util-linux 2.37.4(column from util-linux 2.37.4) |
Linuxのcolumnコマンドとは?テキストを表形式や複数列に整列する機能
column コマンドは、入力されたテキストの列幅(文字数)を自動で計算し、複数列のリストや縦のラインが揃った表形式(テーブル)に整形して標準出力へ書き出すコマンドです。多くのLinuxディストリビューションに標準搭載されている util-linux パッケージに含まれています。
paste・cut・awkコマンドとの違いと使い分け
Linuxで列データを扱うコマンドには paste や cut、awk などがあります。それぞれの役割と column との違いは以下の通りです。
| コマンド | 主な役割・特徴 | 向いている用途 |
|---|---|---|
| column | 各列の最大文字数に合わせて空白を補い、見た目の列幅を揃えて表形式に整列する | CSV・TSV・設定ファイル・コマンド出力のターミナル上での可視化・整形 |
| paste | 複数ファイルの対応する行をタブや指定文字で横方向に結合する | 別ファイルに分かれた列データの単純結合、縦並びデータの1行化 |
| cut | 区切り文字や文字位置を指定して特定の列(フィールド)を切り出す | CSVやログファイルから必要な列だけを抽出する処理 |
| awk | 列単位の抽出・条件分岐・計算・printf による書式指定出力を行う | 条件に合う行のフィルタリング、数値の集計、固定幅フォーマットの生成 |
pasteコマンドが「複数のファイルを横に繋げる」ためのコマンドであるのに対し、column コマンドは「すでに区切られているデータの各列の幅を揃えて、人間が読みやすい表に整える」ためのコマンドです。cutコマンドやawkコマンドで必要な列を抽出したあと、パイプ(|)で最後に column -t へ渡して画面表示を整えるという連携がよく使われます。
基本構文と主なオプション一覧
column コマンドの基本構文は以下の通りです。
column [オプション] [ファイル名...]ファイル名を省略した場合は、標準入力(stdin)からデータを読み取ります。そのため、他コマンドの出力をパイプ(|)で受け取って整形する使い方が一般的です。
column コマンドでよく使用する主なオプションは以下の通りです。
| オプション | 長い形式 | 役割 |
|---|---|---|
-t | --table | 入力データの列数を自動判別し、列幅を揃えた表形式(テーブル)を作成する |
-s <文字> | --separator <文字> | -t 使用時に、入力データの区切り文字(カンマやコロンなど)を指定する |
-o <文字列> | --output-separator <文字列> | -t 使用時に、出力する列と列の間の区切り文字列を指定する(デフォルトは半角スペース2つ) |
-N <名前,...> | --table-columns <名前,...> | カンマ区切りでテーブルのヘッダー(列名)を指定して1行目に表示する |
-R <列,...> | --table-right <列,...> | 指定した列(列名または列番号)のテキストを右寄せにする |
-H <列,...> | --table-hide <列,...> | 指定した列を非表示にする(出力しない) |
-O <列,...> | --table-order <列,...> | 出力する列の並び順を列名または列番号で指定する |
-J | --json | テーブルをJSON形式で出力する(-n でルート名、-N でキー名を指定) |
-c <文字数> | --output-width <文字数> | オプションなし(リスト整列)または折り返し時の出力幅を文字数で指定する |
-x | --fillrows | オプションなし(リスト整列)の際、縦方向(列)ではなく横方向(行)へ順番に並べる |
【基本】-t・-sオプションでテキストやCSVを表形式に整列する
実務で column コマンドを使う場面のほとんどは、-t(--table)オプションを使った表形式への整形です。まずはサンプルファイルを作成し、基本的な動作を確認します。
空白やタブ区切りのテキストを表形式に揃える(-t)
オプションに -t のみを指定すると、入力データの空白(スペースまたはタブ)を区切り文字として自動認識し、各列の最大文字数に合わせて縦のラインを揃えて出力します。
# 空白区切りのサンプルファイルを作成する$ printf "ID Name Role Port\n1 web-server01 frontend 80\n2 app-backend-server01 api 8080\n3 db-primary database 5432\n" > servers.txt
# -t オプションで表形式に整列する$ column -t servers.txtID Name Role Port1 web-server01 frontend 802 app-backend-server01 api 80803 db-primary database 5432文字数が異なる web-server01 と app-backend-server01 の後ろに適切な数のスペースが補われ、Role 列や Port 列の開始位置が綺麗に揃っていることがわかります。
カンマ区切り(CSV)やコロン区切りを表形式にする(-sと-tの併用)
CSVファイル(カンマ区切り)や /etc/passwd(コロン区切り)のように、空白以外の文字で区切られたデータを整形する場合は、-s オプションで入力の区切り文字を指定し、-t オプションと組み合わせて実行します。
# カンマ区切り(CSV)のサンプルファイルを作成する$ printf "1,web-server01,frontend,80\n2,app-backend-server01,api,8080\n3,db-primary,database,5432\n" > servers.csv
# 区切り文字にカンマ(,)を指定して表形式に整列する$ column -s ',' -t servers.csv1 web-server01 frontend 802 app-backend-server01 api 80803 db-primary database 5432同様に、コロン(:)で区切られた /etc/passwd ファイルも、column -s ':' -t を使うと各フィールドが揃った一覧表として確認できます。
$ head -n 3 /etc/passwd | column -s ':' -troot x 0 0 root /root /bin/bashdaemon x 1 1 daemon /usr/sbin /usr/sbin/nologinbin x 2 2 bin /bin /usr/sbin/nologin出力時の区切り文字列を変更して罫線風にする(-o)
column -t で出力される列と列の間は、デフォルトでは「半角スペース2つ」で区切られます。-o(--output-separator)オプションを使うと、出力時の区切り文字列を任意の文字列に変更できます。
例えば、前後にスペースを入れた縦棒(' | ')を指定すると、コンソール上のテーブル表示やMarkdownの表に近い見た目で出力できます。
$ column -s ',' -t -o ' | ' servers.csv1 | web-server01 | frontend | 802 | app-backend-server01 | api | 80803 | db-primary | database | 5432【応用】ヘッダー追加・右寄せ・列の非表示・JSON出力(util-linux版)
現行のLinuxディストリビューション(Ubuntu、Debian、AlmaLinux、Rocky Linuxなど)に搭載されている util-linux 版の column コマンドには、単なる空白揃えだけでなく、高機能なテーブル操作オプションが用意されています。
列名(ヘッダー)の付与(-N)と数値の右寄せ(-R)
ヘッダー行を持たないCSVやコマンド出力に対して、-N(--table-columns)オプションでカンマ区切りの列名を指定すると、1行目にヘッダーを表示できます。さらに -R(--table-right)オプションで列名(または 1 始まりの列番号)を指定すると、数値の列を見やすく右寄せにできます。
# ヘッダー(ID,HOST,ROLE,PORT)を付与し、ID列とPORT列を右寄せにする$ column -s ',' -t -N 'ID,HOST,ROLE,PORT' -R 'ID,PORT' servers.csvID HOST ROLE PORT 1 web-server01 frontend 80 2 app-backend-server01 api 8080 3 db-primary database 5432特定列の非表示(-H)と列の並び替え(-O)
-N オプションで各列に名前を付けておくと(または列番号を使うと)、不要な列を隠したり、列の表示順を入れ替えたりすることも可能です。
-H(--table-hide):指定した列を出力から隠す-O(--table-order):指定した順番に列を並べ替える
# ROLE列を非表示にする(-H)$ column -s ',' -t -N 'ID,HOST,ROLE,PORT' -H 'ROLE' servers.csvID HOST PORT1 web-server01 802 app-backend-server01 80803 db-primary 5432
# HOST, PORT, ID の順番に列を並べ替える(-O)$ column -s ',' -t -N 'ID,HOST,ROLE,PORT' -O 'HOST,PORT,ID' servers.csvHOST PORT ID ROLEweb-server01 80 1 frontendapp-backend-server01 8080 2 apidb-primary 5432 3 database-O オプションで一部の列名だけを指定した場合、指定しなかった残りの列(上記の例では ROLE)は末尾に配置されます。特定の列だけを取り出して並べ替えたい場合は、-H オプションと併用してください。
テキストデータをJSON形式に変換する(-J)
-J(--json)オプションを使用すると、区切り文字で分割したテーブルデータをそのままJSON形式へ変換して出力できます。-N オプションで各フィールドのキー名を指定し、必要に応じて -n(--table-name)オプションでJSON配列の親キー名を指定します。
$ column -s ',' -t -J -n 'servers' -N 'id,host,role,port' servers.csv{ "servers": [ {"id":"1", "host":"web-server01", "role":"frontend", "port":"80"}, {"id":"2", "host":"app-backend-server01", "role":"api", "port":"8080"}, {"id":"3", "host":"db-primary", "role":"database", "port":"5432"} ]}オプションなし(デフォルト)で縦並びリストを複数列に並べる
なお、-t オプションを付けずに column コマンドを実行した場合は、表形式の整列ではなく、縦に並んだ1列のリストを画面幅(または -c で指定した文字幅)に収まるよう複数列に折り返して並べる動作になります。
デフォルトでは縦方向(列優先)にデータが並びますが、-x(--fillrows)オプションを付けると横方向(行優先)に順番が並びます。
# デフォルト:縦方向(上→下)に順番に並べる(幅30文字指定)$ seq 1 6 | column -c 301 3 52 4 6
# -x オプション:横方向(左→右)に順番に並べる(幅30文字指定)$ seq 1 6 | column -x -c 301 2 34 5 6このように、-t の有無によって「複数列の表形式(テーブル)として縦の列幅を揃える」か「1列のリストを複数列へ折り返す」かが切り替わるため、用途に応じて使い分けます。
実務でcolumnコマンドを使う際の注意点
column コマンドをシェルスクリプトや日常のログ解析で利用する際は、以下の2つの仕様に注意してください。
1. 空のフィールド(連続する区切り文字)の扱いとバージョン差
CSVファイルなどに 2,,8080 のような空のカラム(連続する区切り文字)が含まれている場合、column コマンドのバージョンや実装によって空フィールドが維持されるか無視されるかが異なります。
現行のLinux(util-linux 2.30以降)の column -s ',' -t では、以下のように空のフィールドも1つの空カラムとして維持され、列ずれを起こさずに整列されます。
# util-linux版の column では空フィールドも維持される$ printf "1,web01,80\n2,,8080\n" | column -s ',' -t1 web01 802 8080一方で、古いバージョンの util-linux や BSD系(macOSmacOS [マックオーエス]Appleが開発するMac用のオペレーティングシステムなど)の column コマンドでは、連続する区切り文字が1つにまとめられてしまい、後ろの列が左に詰まって列ずれを起こす仕様になっている場合があります(BSD系では -n オプションで空列の結合を防ぐなど、オプション体系も異なります)。異なるOS間で動くスクリプトを書く場合は、この挙動の違いに留意してください。
2. 引用符(“)で囲まれたCSV内のカンマは区別されない
column -s ',' -t では、ダブルクォーテーション(")で囲まれたフィールド内のカンマも区切り文字として扱われる点に注意が必要です。
column コマンドはCSVの構文(RFC 4180など)を解析するわけではなく、単純に -s で指定した文字が現れた位置でフィールドを分割します。そのため、1,"Tokyo, Japan",80 のように引用符の中にカンマが含まれているデータでは、意図しない位置で列が分割されてしまいます。
引用符やエスケープを含む複雑なCSVファイルを正確に解析・処理したい場合は、PythonPython [パイソン]汎用プログラミング言語の csv モジュールや専用ツールを使用してください。
まとめ:columnコマンドでテキストやCSVの閲覧を見やすく効率化しよう
本記事では、Linuxの column コマンドを使って空白区切りテキストやCSVファイルを表形式に整形する方法について解説しました。
記事の要点を以下にまとめます。
column -tを実行すると、空白区切りのテキストの各列幅を自動計算し、縦のラインが揃った表形式(テーブル)に整列できる。- CSVや
/etc/passwdなど空白以外の文字で区切られたデータは、column -s ',' -tやcolumn -s ':' -tのように-sオプションで区切り文字を指定する。 -o ' | 'で出力時の区切り文字列を変更できるほか、util-linux版では-N(ヘッダー追加)、-R(右寄せ)、-H(非表示)、-J(JSON変換)などのオプションも利用できる。- オプションなし(または
-x)で実行した場合は、縦1列のリストを画面幅に合わせて複数列に折り返して表示できる。
パイプラインの末尾に | column -t を付け足すだけで、ターミナル上でのデータの視認性が大きく向上します。列の抽出やテキスト検索を行う他のコマンドとの組み合わせについては、Linuxのテキスト処理・検索コマンドの使い方まとめもあわせて参考にしてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。