このすみノート

Webエンジニアが技術や趣味を書くブログです。

Lninxの行番号付きでファイル内容を表示する『cat -n』と『nl』コマンドの違い

中断していたLinuxのLPIC問題集を再開したのですが、行番号付きでファイル内容を出力する、catコマンドの-nオプションに遭遇しました。

ところが、行番号付きでファイル内容を出力するコマンドには、nlもあります。

違いが気になったので、調べました。

空行の扱いに違いがある

サンプルとして、空行のある適当なテキストファイルを作成します。 なお、WSL2上のUbuntuにて実行しております。

$ vim abc
a
b

c

cat -nの場合

実際に実行してみると、空行にも行番号が振られていることがわかります。

$ cat -n abc
     1  a
     2  b
     3
     4  c

nlの場合

同じく実行してみましたが、空行は空行として表示され、行番号が振られていないことがわかります。

$ nl abc
     1  a
     2  b

     3  c

nlでも空行に行番号を表示するには

nlコマンドで空行にも行番号を表示するには、nl -baまたはnl --body-numbering=aとします。

nl -ba

$ nl -ba abc
     1  a
     2  b
     3
     4  c

nl --body-numbering=a

user@DESKTOP-H7STV4V:/tmp$ nl  --body-numbering=a abc
     1  a
     2  b
     3
     4  c

nlコマンドは、行番号を付与する条件に柔軟性があり、正規表現を使うことも可能なようです。

オプション 意味
a 全ての行に対して行番号を付ける
t 空行以外に対して行番号を付ける
n 空行に対して行番号を付ける
pパターン パターン(基本正規表現)に一致する行に対して行番号を付ける

https://www.atmarkit.co.jp/ait/articles/1703/30/news024.html より

まとめ

細かな差分ではありますが、大事なことかと思いますので、知っておいて損はなさそうです。

コマンド 解説
cat -n 空行も行番号を表示する
nl 空行は行番号を付けない
nl -ba 空行も行番号を表示する
nl --body-numbering=a` 空行も行番号を表示する