はじめに
このチュートリアルでは、テキストファイルに行番号を付けるために使用する Linux の nl コマンドについて学びます。さまざまな場面での使い方を確認し、文書内の特定の行を簡単に参照できるようにします。このスキルは、プログラマーやシステム管理者をはじめ、日常的にテキストファイルを扱う人にとって特に役立ちます。
あなたが junior ソフトウェア開発者として、初めて大規模なプロジェクトに取り組んでいる場面を想像してください。チームリーダーから設定ファイルを確認し、特定のセクションについて話し合うよう依頼されました。nl コマンドを使えば、ファイル内の該当する行を簡単に示して議論できるため、チームでの共同作業をより効率的に進められます。
基本的な nl コマンドを理解する
このステップでは、nl コマンドを使ってサンプル設定ファイルを確認します。
まず、プロジェクトディレクトリへ移動します。次のコマンドを入力して Enter キーを押してください。
cd /home/labex/project
このコマンドにより、現在のディレクトリがサンプルファイルの保存されている /home/labex/project に変更されます。
次に、nl コマンドを使って config.txt の内容を行番号付きで表示します。次を入力してください。
nl config.txt | tee nl-basic.txt
次のような出力が表示されます。
1 ## Server Configuration
2 port=8080
3 max_connections=100
4
5 ## Database Settings
6 db_host=localhost
7 db_port=5432
8 db_name=myapp
...
ここで行われていることを確認しましょう。
nlコマンドによって、ファイル内の各行の左側に行番号が追加されます。- 行番号は 6 文字幅の列内で右寄せされていることが分かります。
- 空行(元のファイルの 4 行目)は、デフォルトでは番号が付けられません。
teeコマンドは出力を画面に表示すると同時に、nl-basic.txtに保存します。
行番号が付いていると、同僚とファイルについて話す際に特定の行を簡単に指定できます。たとえば、「ポート番号を確認するために 2 行目を見てみましょう」と伝えられます。
この出力が表示されない場合やエラーが発生した場合は、正しいディレクトリ(/home/labex/project)にいることと、config.txt ファイルが存在することを確認してください。現在のディレクトリ内のファイルを一覧表示するには、ls コマンドを使用します。
空行を含むすべての行に番号を付ける
このステップでは、空行を含むすべての行に番号を付けます。空行を参照する必要がある場合や、空行自体に意味があるファイルを扱う場合に便利です。ここでは -b a オプションを使用します。
次のコマンドを実行してください。
nl -b a config.txt | tee nl-all-lines.txt
次のような出力が表示されます。
1 ## Server Configuration
2 port=8080
3 max_connections=100
4
5 ## Database Settings
6 db_host=localhost
7 db_port=5432
8 db_name=myapp
...
処理の内容を確認しましょう。
-bオプションは、ファイル本文の行番号付け方法を指定します。aは「all」を表し、空行を含むすべての行に番号を付けるようnlに指示します。- これまで空白のまま番号が付かなかった 4 行目にも、番号が付いていることに注目してください。
teeは出力を画面に表示すると同時に、nl-all-lines.txtに保存します。
これは、議論の中で空行を参照したい場合や、空行に意味があるファイル(プログラミング言語や設定ファイルの一部など)を扱う場合に特に役立ちます。
空行に番号が付かない場合は、コマンドに -b a オプションが含まれているか確認してください。
行番号の形式をカスタマイズする
このステップでは、行番号の表示形式を変更します。可読性を高めたり、後続の処理に適した形式で出力したりする場合に便利です。ここでは、番号を右寄せし、先頭に 0 を付けてみます。
-n rz オプションを使用します。
nl -n rz config.txt | tee nl-zero-padded.txt
次のような出力になります。
000001 ## Server Configuration
000002 port=8080
000003 max_connections=100
000004 ## Database Settings
000005 db_host=localhost
000006 db_port=5432
000007 db_name=myapp
000008 ### Logging Configuration
000009 log_level=info
000010 log_file=/var/log/myapp.log
000011 ## Security Settings
000012 enable_ssl=true
000013 ssl_cert_path=/etc/ssl/certs/myapp.crt
000014 ### Performance Tuning
000015 cache_size=1024
000016 thread_pool=20
000017 ## Miscellaneous
000018 debug_mode=false
-n rz オプションの意味を確認しましょう。
-nは行番号の表示形式を指定します。rは右寄せを意味します(実際にはデフォルトの設定です)。zは番号の先頭を 0 で埋めることを意味します。teeは出力を画面に表示すると同時に、nl-zero-padded.txtに保存します。
この形式は、他のコマンドで出力を並べ替えたり、さらに処理したりする場合に特に便利です。桁幅が固定されるため、番号の位置が常に揃うからです。
出力が一致しない場合は、-n rz オプションを含め、コマンドを正しく入力したか確認してください。
特定の種類の行にだけ番号を付ける
このステップでは、nl を使って特定の種類の行だけに番号を付けます。複雑なファイルの中から、必要な行だけに注目したい場合に非常に役立ちます。ここでは、空でなく、かつ # で始まらない行だけに番号を付けます。設定ファイルでは、# で始まる行がコメントとして使われることがよくあります。
次のコマンドを使用してください。
nl -b p'^[^#]' config.txt | tee nl-settings-only.txt
次のような出力が表示されます。
## Server Configuration
1 port=8080
2 max_connections=100
## Database Settings
3 db_host=localhost
4 db_port=5432
5 db_name=myapp
### Logging Configuration
6 log_level=info
7 log_file=/var/log/myapp.log
## Security Settings
8 enable_ssl=true
9 ssl_cert_path=/etc/ssl/certs/myapp.crt
### Performance Tuning
10 cache_size=1024
11 thread_pool=20
## Miscellaneous
12 debug_mode=false
この複雑なコマンドを分解して説明します。
-b pは、特定のパターンに一致する行だけに番号を付けるようnlに指示します。'^[^#]'は正規表現パターンです。^は「行の先頭」を意味します。[^#]は「#ではない任意の文字」を意味します。- したがって、これらを組み合わせると、
#で始まらない行に一致します。
teeは出力を画面に表示すると同時に、nl-settings-only.txtに保存します。
このコマンドは、コメントを除外して有効な設定行だけを確認したい場合に便利です。特に大規模な設定ファイルから、実際の設定内容をすばやく見つけて参照したい場合に役立ちます。
期待した出力が表示されない場合は、パターンを囲むシングルクォートも含め、コマンドを表示どおり正確に入力したか確認してください。
オプションを組み合わせて複雑な番号付けを行う
このステップでは、複数の nl オプションを組み合わせ、より複雑な番号付けを行います。すべての行に番号を付け、表示形式を指定し、番号欄の幅も設定します。
次のコマンドを実行してください。
nl -b a -n rz -s ': ' -w 3 config.txt | tee nl-combined.txt
このコマンドでは、次の処理を行います。
-b a: 空行を含むすべての行に番号を付ける-n rz: 番号を右寄せし、先頭を 0 で埋める-s ': ': 番号と行の内容の区切り文字として:を使用する-w 3: 番号欄の幅を 3 文字に設定する
次のような出力が表示されます。
001: ## Server Configuration
002: port=8080
003: max_connections=100
004:
005: ## Database Settings
006: db_host=localhost
007: db_port=5432
008: db_name=myapp
009:
010: ### Logging Configuration
011: log_level=info
012: log_file=/var/log/myapp.log
013:
014: ## Security Settings
015: enable_ssl=true
016: ssl_cert_path=/etc/ssl/certs/myapp.crt
017:
018: ### Performance Tuning
019: cache_size=1024
020: thread_pool=20
021:
022: ## Miscellaneous
023: debug_mode=false
処理の内容を確認しましょう。
- 空行を含むすべての行に番号が付けられます。
- 番号は右寄せされ、先頭が 0 で埋められます。
- 番号と行の内容の間の区切り文字には
:が使われます。 - 番号欄の幅は 3 文字に設定されます。
- 表示された出力は
nl-combined.txtに保存されます。
このような複雑な番号付けは、構造化された設定ファイルや、セクションごとに構成された文書を扱う場合に非常に便利です。各セクション内の行を簡単に参照できるようになります。
出力が完全に一致しない場合は、入力したコマンドを慎重に見直してください。特に、スペースや特殊文字が正しいか確認しましょう。
まとめ
このチュートリアルでは、テキストファイルに行番号を付けるための nl コマンドと、さまざまなオプションについて学びました。具体的には、次の内容を確認しました。
- 基本的な
nlコマンドを使ってファイルに行番号を付ける -b aオプションを使って、空行を含むすべての行に番号を付ける-n rzオプションで番号の表示形式をカスタマイズする- パターンマッチングを使って特定の種類の行に番号を付ける
- 複数のオプションを組み合わせて複雑な番号付けを行う
これらのスキルを身に付けると、開発プロジェクトで扱う設定ファイルやソースコード、その他のテキストファイル内の行を効率よく確認し、参照できるようになります。
このチュートリアルでは扱わなかった nl コマンドの追加オプションには、次のようなものがあります。
-v NUM: 1 ではなく NUM から番号付けを開始する-i NUM: 1 ではなく NUM ずつ番号を増やす-l NUM: NUM 行を 1 つのグループとして扱い、各グループの先頭行にだけ番号を付ける-f a: すべてのヘッダー行(最初の本文行より前にある行)に番号を付ける
これらのオプションを使うことで、nl コマンドをさらに柔軟に活用できます。



