nl コマンド入門 - 行番号を付けて出力する

nl コマンド入門 - 行番号を付けて出力する

この記事でわかること

  • nl コマンド で行番号を付けて出力する方法が分かる
  • nlcat -n決定的な違い(空行の扱い)が分かる
  • 番号の 桁幅・区切り文字・開始番号・増分・書式 の変え方が分かる
  • ログやソースの「何行目か」を すぐ伝えられる ようになる

結論(先に覚えるべき型)

  • とりあえず番号を付けたい → nl file
  • 空行にも番号を振りたい → nl -b a file
  • cat -n でも全行に番号は振れる(手軽さ優先ならこちら)

1. nl コマンドって何?

結論: nl(number lines)はテキストの各行の先頭に行番号を付けて出力するコマンド。既定では空行に番号を振らない。

リナ: 先輩、ファイルの中身を「何行目」って数えながら見たいんですけど、いちいち指で数えるしかないですか?
ライニー先輩: いや、nl コマンドを使えば行番号を付けて表示してくれるよ。nl は number lines、つまり「行に番号を振る」の略なんだ。
リナ: 早く知りたかったです。どう使うんですか?
ライニー先輩: ファイル名を渡すだけ。nl ファイル名 でいいよ。

memo.txt という 3 行のファイルで試してみよう。

$ cat memo.txt
りんご
みかん
ぶどう

ここに nl を通すと、各行の先頭に番号が付く。

$ nl memo.txt
     1	りんご
     2	みかん
     3	ぶどう

nl の基本

nl ファイル名 で、各行の先頭に 右寄せの行番号 が付く。番号と本文の間は タブ で区切られる。

2. nl と cat -n は何が違う?

結論: 最大の違いは空行の扱い。nl は既定で空行に番号を振らないが、cat -n はすべての行に番号を振る。

リナ: 行番号なら cat -n でも付きますよね? 何が違うんですか?
ライニー先輩: いい質問。一番の違いは 空行の扱い だよ。実際に見てみよう。

途中に空行が入った list.txt を用意する。

$ cat list.txt
赤

青

緑

まず nl を通すと、空行には番号が振られない

$ nl list.txt
     1	赤

     2	青

     3	緑

一方 cat -n は、空行も含めて全部の行に番号を振る

$ cat -n list.txt
     1	赤
     2
     3	青
     4
     5	緑

使い分けの目安

やりたいこと コマンド
中身のある行だけ数えたい nl file
空行も含めて物理的な行数を数えたい cat -n file
番号の桁幅や書式を細かく変えたい nl(オプション豊富)
リナ: なるほど、nl は「意味のある行」を数えてくれる感じなんですね。
ライニー先輩: そう。あとで紹介するけど、nl は番号の幅や区切り文字を細かく指定できるから、見た目を整えたいときにも強いよ。

3. 空行にも番号を付ける:-b a

結論: -b a を付けると空行を含めた全行に番号が振られる。-b は本文の番号付け方式(body)を指定するオプション。

空行にも番号を振りたいときは -b a を使う。a は all(すべての行)の意味。

$ nl -b a list.txt
     1	赤
     2
     3	青
     4
     5	緑

-b で指定できる主な方式

  • -b a:すべての行に番号を振る(all)
  • -b t:空行以外に番号を振る(既定値、t は text)
  • -b n:番号を振らない(none)
リナ: 既定が -b t だから、何も付けないと空行が飛ばされるんですね。
ライニー先輩: その通り。「全部に振りたい」と思ったら -b a を思い出して。

4. 番号の見た目を整える:-w / -s

結論: -w で番号の桁幅、-s で番号と本文の区切り文字を変えられる。既定は幅 6・区切りはタブ。

4-1. 桁幅を変える(-w)

既定では番号の幅は 6 桁分とられている。-w で幅を指定できる。

$ nl -w 3 memo.txt
  1	りんご
  2	みかん
  3	ぶどう

4-2. 区切り文字を変える(-s)

番号と本文の間は既定でタブ。-s で好きな文字列に変えられる。

$ nl -s '. ' memo.txt
     1. りんご
     2. みかん
     3. ぶどう
リナ: -s '. ' で「1. りんご」みたいに、箇条書きっぽくできるんですね。
ライニー先輩: そう。区切りはスペースを含めてもいいから、-w-s を組み合わせると読みやすい一覧が作れるよ。

5. 開始番号と増分を変える:-v / -i

結論: -v で開始番号、-i で増分を指定できる。100 行目から始める・2 ずつ増やす、といった調整ができる。

5-1. 開始番号を変える(-v)

-v は番号の開始値。100 から始めたいときはこうする。

$ nl -v 100 memo.txt
   100	りんご
   101	みかん
   102	ぶどう

5-2. 増分を変える(-i)

-i は 1 行ごとに増やす量。2 ずつ増やすには -i 2

$ nl -i 2 memo.txt
     1	りんご
     3	みかん
     5	ぶどう

-v-i は組み合わせられる。nl -v 10 -i 10 memo.txt なら 10, 20, 30 と振られる。

6. ゼロ埋め・左寄せ:-n

結論: -n で番号の書式を指定する。rz でゼロ埋め、ln で左寄せ、rn(既定)で右寄せ。

-n は番号の表示書式を決めるオプション。

$ nl -n rz -w 3 memo.txt
001	りんご
002	みかん
003	ぶどう

-n で指定できる書式

意味
rn 右寄せ・ゼロ埋めなし(既定)
rz 右寄せ・ゼロ埋め
ln 左寄せ

7. パイプで使う

結論: nl はファイル名を省略すると標準入力を読む。他コマンドの出力にパイプでつないで行番号を付けられる。

ファイル名を渡さずパイプでつなぐと、前のコマンドの出力に番号を付けられる。

$ ls /etc | nl
     1	hostname
     2	hosts
     3	passwd
リナ: 一覧の「何番目か」をすぐ言えますね。
ライニー先輩: そう。grep の結果に nl をつないで「何件目か」を数えるのもよくやる使い方だよ。

パイプ元に空行が含まれると、既定では空行に番号が振られない。件数を正確に数えたいときは -b a を付けるか cat -n を使うこと。

8. ミニ課題:実際にやってみよう

結論: ファイル作成・空行を含む番号付け・書式調整の 3 問で、nl の基本を手で確かめる。

リナ: 手を動かして覚えたいです!
ライニー先輩: いいね、3 問用意したよ。まずは練習用のファイルを作ろう。
ライニー先輩: printf 'a\n\nb\n\nc\n' > sample.txt

課題1: sample.txtnl で行番号を付けて表示しよう(空行は番号なしでよい)。

ヒントを見る

ファイル名を渡すだけ。nl ファイル名

解答例
$ nl sample.txt

課題2: 同じ sample.txt で、空行にも番号を振って表示しよう。

ヒントを見る

本文の番号付け方式を all にする -b a を使う。

解答例
$ nl -b a sample.txt

課題3: sample.txt の番号を 3 桁ゼロ埋め(001, 002, ...)で表示しよう。

ヒントを見る

書式 -n rz と桁幅 -w 3 を組み合わせる。

解答例
$ nl -n rz -w 3 sample.txt

9. コピペ用テンプレート

結論: 基本・全行番号・書式調整・パイプのよく使う型をまとめて手元に置いておく。

よく使う型をまとめておく

# 基本(空行以外に番号)
nl file.txt

# 空行も含めて全行に番号
nl -b a file.txt

# 桁幅3・区切りをドットに
nl -w 3 -s '. ' file.txt

# 100行目から、2ずつ
nl -v 100 -i 2 file.txt

# 3桁ゼロ埋め
nl -n rz -w 3 file.txt

# パイプで他コマンドの出力に番号付け
ls /etc | nl

次に読む