Linux nl コマンド
一、nl コマンド概要
nlnl コマンドは、Linux システムにおけるシンプルだが実用的なコマンドラインツールで、正式名称は「number lines」(行番号)です。その主な機能は、ファイルの内容を読み取り、各行に行番号を追加して、結果を標準出力に出力することです。
1.1 なぜ nl コマンドが必要なのか
日常の開発やシステム管理では、以下のようなニーズがよくあります:
- コードやログファイルの特定の行をすばやく確認する
- ファイルの内容を議論する際に、具体的な行番号を参照しやすくする
- ファイルの内容に番号を付けて、後続の処理をしやすくする
- 行番号付きのドキュメントやレポートを生成する
確かにcat -nでも同様の機能を実現できますがnlより豊富な行番号制御オプションを提供し、より複雑なニーズを満たすことができます。
二、基本構文とパラメータ
2.1 基本コマンド形式
実例
nl [オプション]... [ファイル]...
2.2 よく使うオプションの説明
| オプション | 説明 |
|---|---|
-b |
行番号の計算ルールを指定する(後ろにスタイルを続ける) |
-i |
行番号の増分を設定する(デフォルトは1) |
-n |
行番号のフォーマットを設定する(左詰め/右詰め/0を付けない) |
-s |
行番号と内容の間の区切り文字を設定する |
-v |
開始行番号を設定する(デフォルトは1) |
-w |
行番号フィールドの幅(文字数)を設定する |
-p |
ページ区切りで行番号をリセットしない |
2.3 行番号計算ルール(-b オプション)
-bオプションの後には以下のスタイルを指定できます:
| スタイル | 説明 |
|---|---|
a |
すべての行に番号を付ける |
t |
空でない行のみに番号を付ける(デフォルト) |
n |
番号を付けない |
p正则表达式 |
正規表現に一致する行のみに番号を付ける |
三、実用サンプルデモ
3.1 基本用法:ファイルに行番号を追加する
実例
# example.txt のすべての空でない行に行番号を追加する
nl example.txt
# すべての行(空行を含む)に行番号を追加する
nl -b a example.txt
nl example.txt
# すべての行(空行を含む)に行番号を追加する
nl -b a example.txt
3.2 行番号フォーマットのカスタマイズ
実例
# 行番号の幅を3に設定し、右詰めフォーマットを使用する
nl -n rz -w 3 example.txt
# "|" を区切り文字として使用し、行番号を左詰めにする
nl -s " | " -n ln example.txt
nl -n rz -w 3 example.txt
# "|" を区切り文字として使用し、行番号を左詰めにする
nl -s " | " -n ln example.txt
3.3 高度な番号付けルール
実例
# 10から番号を開始し、増分を2にする
nl -v 10 -i 2 example.txt
# "error" を含む行のみに番号を付ける
nl -b perror example.log
nl -v 10 -i 2 example.txt
# "error" を含む行のみに番号を付ける
nl -b perror example.log
3.4 複数ファイルの処理
実例
# 複数のファイルに連続して番号を付ける
nl file1.txt file2.txt
# 各ファイルに個別に番号を付ける
nl -p file1.txt file2.txt
nl file1.txt file2.txt
# 各ファイルに個別に番号を付ける
nl -p file1.txt file2.txt
四、他のコマンドとの比較
4.1 nl vs cat -n
| 特性 | nl | cat -n |
|---|---|---|
| デフォルトの動作 | 空でない行のみに番号を付ける | すべての行に番号を付ける |
| フォーマット制御 | 豊富(配置、幅、区切り文字など) | 限定的 |
| 番号付けルール | カスタマイズ可能(正規表現マッチなど) | 固定 |
| パフォーマンス | やや遅い | やや速い |
4.2 nl vs grep -n
grep -nでも行番号を表示しますが、主な用途は検索とフィルタリングであり、行番号は付加情報にすぎません。nlは行番号表示に特化して最適化されたツールです。
五、実際の応用シーン
5.1 コードレビュー
実例
# 行番号付きのコードファイルを生成して、議論をしやすくする
nl -w 3 -n rz source.py > numbered_source.txt
nl -w 3 -n rz source.py > numbered_source.txt
5.2 ログ分析
実例
# "ERROR" を含むログ行のみに番号を付ける
nl -b pERROR app.log | less
nl -b pERROR app.log | less
5.3 ドキュメント処理
実例
# 行番号付きのMarkdownドキュメントを生成する
nl -s ". " -w 2 -n rz README.md
nl -s ". " -w 2 -n rz README.md
六、注意事項とテクニック
- 空行の処理:デフォルトでは
nlは空行をスキップします。を使用すると-b aすべての行に強制的に番号を付けることができます - 大容量ファイルの処理:超大容量ファイルの場合は、と組み合わせて
less或head使用することを検討してください - パイプラインでの使用:標準入力を受け取ることができます。例:
cat file | nl - フォーマットの一貫性:スクリプトではパラメータのセットを固定して使用し、出力フォーマットを統一することをお勧めします
- パフォーマンスの考慮:単純な行番号のニーズには、
cat -nの方が速い場合があります
七、まとめと練習
7.1 練習問題
- テストファイルを作成する
test.txt5行のテキストと2つの空行を含む - を使用して
nlすべての行番号を表示する(空行を含む) - 行番号を100から開始し、増分を5に設定する
- "::" を区切り文字として使用し、行番号の幅を4にする
- 結果をにリダイレクトする
numbered.txt
7.2 参考解答
実例
# テストファイルを作成する
echo -e "1行目\n\n2行目\n3行目\n\n4行目\n5行目" > test.txt
# nl コマンドを実行する
nl -b a -v 100 -i 5 -s "::" -w 4 test.txt > numbered.txt
# 結果を確認する
cat numbered.txt
echo -e "1行目\n\n2行目\n3行目\n\n4行目\n5行目" > test.txt
# nl コマンドを実行する
nl -b a -v 100 -i 5 -s "::" -w 4 test.txt > numbered.txt
# 結果を確認する
cat numbered.txt