MENU

設定ファイルを行番号付きで確認し、エラー該当行へ即座にたどり着く方法

目次

まず結論:行番号付きで表示するコマンド

設定ファイルの内容を行番号付きで確認するには、cat -n が最短です。オプション一つで全行に通し番号が振られます。

cat -n /etc/nginx/nginx.conf

出力例は以下のとおりです。

     1	user nginx;
     2	worker_processes auto;
     3	
     4	error_log /var/log/nginx/error.log notice;
     5	pid /run/nginx.pid;

空行を除いて番号を振りたい場合は -b オプションを使います。コメント行や空行が多い設定ファイルでは、実質的な設定行だけに番号が振られるため、行数の感覚が掴みやすくなります。

cat -b /etc/nginx/nginx.conf

大きなファイルはスクロールしながら行番号を確認する

数百行を超える設定ファイルを確認するときは less -N が適しています。スクロール中も行番号が左端に表示され続けるため、エラーメッセージの「line XX」を目で追いながら読み進められます。

less -N /etc/ssh/sshd_config

less 起動後に行番号表示を切り替えたい場合は、-(ハイフン)に続けて N を入力し Enter を押します。起動オプションを変えなくても手元でトグルできるので便利です。また、less 内で特定の行へジャンプするには 42g(行番号+g)と入力します。

エラーログに出た行番号へ即座にジャンプする

nginx -tsshd -Tapachectl configtest などが「syntax error on line 42」のようなメッセージを出したとき、該当行だけを素早く取り出せると、ファイルを頭から読む手間を省けます。

1行だけ取り出す場合は sed -n が確実です。

sed -n '42p' /etc/nginx/nginx.conf

前後の文脈を含めて確認したいときは範囲を指定します。

# 42行目の前後5行(37〜47行目)を表示
sed -n '37,47p' /etc/nginx/nginx.conf

ある運用現場では、systemctl status nginx の出力に含まれるエラー行番号をそのまま上記コマンドに渡すことで、設定修正のサイクルを大幅に短縮できたという事例があります。journalctlとの組み合わせで行番号を拾う場合は次のようにします。

# journalctlでエラー行番号を確認してから該当行を抽出する例
journalctl -u nginx --no-pager | grep -i "line"
sed -n '42p' /etc/nginx/nginx.conf

grep に -n を付けて行番号ごと横断検索する

設定の値が複数ファイルに分散しているときは grep -n で行番号付き検索をかけます。-r を加えると再帰的にディレクトリを検索でき、インクルード構成の設定ファイル群にも対応できます。

grep -rn 'ServerName' /etc/apache2/

出力例は以下のとおりです。

/etc/apache2/sites-enabled/000-default.conf:4:ServerName example.com
/etc/apache2/sites-enabled/ssl.conf:7:ServerName example.com

ファイル名・行番号・内容が同時に表示されるため、複数ファイルにまたがる設定の重複や漏れを一気にチェックできます。

注意点と実務上の落とし穴

シンボリックリンクに注意する
/etc/nginx/nginx.conf/etc/alternatives/ 配下のファイルがシンボリックリンクになっているケースがあります。cat はリンク先の実体を読むため、行番号は正しく表示されますが、エディタで開くときはリンク先を意識しないと意図しないファイルを編集することになります。事前に実体パスを確認する習慣をつけておくと安全です。

readlink -f /etc/nginx/nginx.conf

バイナリファイルには使わない
cat -n はバイナリファイルに対しても実行できてしまいます。誤ってバイナリを渡すと端末が文字化けし、操作不能になる場合があります。対象ファイルが不明なときは先に file コマンドで種別を確認してください。

file /path/to/target

Windows由来の改行コード(CR+LF)に注意する
Windowsで作成した設定ファイルをLinuxに転送すると、行末に \r(CR)が残り、Apacheやnginxが構文エラーとして扱うことがあります。cat -A で表示したとき行末に ^M が見えたら、dos2unix で変換するか次のコマンドで除去してください。

# CR+LF を LF に変換(ファイルを直接書き換えるため注意)
sed -i 's/\r//' /etc/nginx/nginx.conf

上記の sed -i はファイルを直接書き換えます。重要な設定ファイルに対して実行する前に、cp でバックアップを取っておくことを推奨します。

<PR>この記事に関連するおすすめ書籍

新しいLinuxの教科書 第2版

コマンド操作から基本的な運用までを手を動かしながら体系的に学べる定番書。地力を固めたい方に。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次