nlコマンドはテキストデータに行番号を付加する機能を持つ、便利なコマンドラインユーティリティです。ほとんどのUnix系環境では、特別なソフトウェアをインストールをすることなく最初から使うことができるコマンドです。この記事では、はじめてnl
を触る人でも気軽に試せるよう基本的な使い方を説明します。
nlコマンドができること
nl
ができることは「テキストデータに行番号をふる」ことです。それ以上でも以下でもありません。コマンドの機能としてはそれだけですが、行番号をふることに関して様々な要求を満たすためのオプションを持っています。そして他のコマンドと組み合わせることで、その用途は「行番号をふる」という枠を越えて広がっていきます。
nlコマンドの使い方
基本的な使い方
例えば、JR上野東京ライン北行(宇都宮線・高崎線)の駅名が記載された「utl-kita」という名前のテキストファイルがあるとします。ファイルの中身をそのまま標準出力に表示するcat
を使うと次のようになります。
$ cat utl-kita
東京
上野
尾久
赤羽
浦和
さいたま新都心
大宮
このテキストファイル「utl-kita」にnl
を使用した場合、以下のような出力になります。
$ nl utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
これでnl
によって行の先頭に行番号が付加されたことが確認できたと思います。
標準入出力の利用
引数を指定してファイルから読み込む以外にも、標準入力から直接データを受け取ることができます。また、標準入力から受け取ることをより明示的にするために、-
という特殊な引数も用意されています。標準入出力と|
(パイプ)を利用することで、様々なコマンドを組み合わせることができます。
さきほどの例は、cat
とnl
を組み合わせて以下のように実行しても同じ結果になります。
$ cat utl-kita | nl
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
パイプを使えばいくつでもコマンドをつなげることができます。以下の例では、yes
によって出力される「y」にnl
が行番号を付加し、head
が先頭3行だけを切り取って標準出力に表示しています。
$ yes | nl | head -n 3
1 y
2 y
3 y
#リダイレクトとファイル
行番号を付加したデータをファイルに保存するには、>
(リダイレクト)を使って出力するファイルを指定します。
$ nl utl-kita > numbered_utl-kita
$ cat numbered_utl-kita
1 東京
2 上野
3 尾久
4 赤羽
5 浦和
6 さいたま新都心
7 大宮
これでファイルに保存することができました。残念ながらリダイレクトで元のファイルへの上書き保存はできません。ファイルが消失するので、試す場合は覚悟を持って試しましょう。
$ nl utl-kita > utl-kita
$ cat utl-kita
$ wc utl-kita
0 0 0 utl-kita
リダイレクトで読み込むファイルと同じファイルに出力した結果、データが消失していることがわかります。wc
は文字数をカウントするコマンドで、出力の3つの0 0 0
は、左から行数、単語数、バイト数を表します。参考までに元のテキストファイルに対してwc
を実行したときの結果は以下になります。
$ wc utl-kita
7 7 64 utl-kita
$ wc numbered_utl-kita
7 14 113 numbered_utl-kita
詳しくは説明しませんが、上書き保存をするにはmoreutilsというコマンドユーティリティに含まれるspongeコマンドを利用する方法などがあります。
#補足
サンプルのutl-kita
ファイルは、以下のテキストをプロンプトに貼り付ければ簡単に作成することができます。
cat <<EOF >utl-kita
東京
上野
尾久
赤羽
浦和
さいたま新都心
大宮
EOF