はじめに
grepはテキスト検索で頻繁に利用されるコマンドです。
特に検索結果がどの行に存在するのかを確認したい場面では、行番号の表示機能が役立ちます。
本記事では、grepで行番号を表示する基本構文から応用までを解説します
参考:GNU grep
grepで行番号を表示する基本構文
ファイル作成
cat << 'EOF' > input.txt
apple
banana
grape
banana smoothie
orange
EOF
実行コマンド
grep -n "banana" input.txt
実行結果
2:banana
4:banana smoothie
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定した文字列を検索する |
| -n | 一致した行の先頭に行番号を表示する |
| "banana" | 検索対象の文字列 |
| input.txt | 検索対象のファイル |
解説
grep -n を使用すると、検索結果とあわせて行番号を表示できます。
設定ファイルやログファイルから該当箇所を素早く特定したい場合に便利です。
grepで行番号付きの検索結果をファイル名込みで表示する
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple juice
grape
EOF
実行コマンド
grep -nH "apple" input.txt
実行結果
input.txt:1:apple
input.txt:4:apple juice
仕組み
| オプション | 説明 |
|---|---|
| grep | 指定した文字列を検索するコマンド |
| -n | 一致した行の行番号を表示する |
| -H | 検索結果の先頭にファイル名を表示する |
| "apple" | 検索キーワード |
| input.txt | 検索対象ファイル |
解説
grep -nH を使用すると、検索結果に行番号とファイル名を同時に表示できます。
複数ファイルを検索する際に、どのファイルの何行目に一致したかを素早く確認できます。
grepで複数ファイルの行番号を一覧表示する
ファイル作成
cat << 'EOF' > file1.txt
apple
banana
orange
banana
EOF
ファイル作成
cat << 'EOF' > file2.txt
grape
banana
melon
EOF
ファイル作成
cat << 'EOF' > file3.txt
banana
peach
banana
EOF
実行コマンド
grep -n "banana" file1.txt
実行結果
2:banana
4:banana
実行コマンド
grep -n "banana" file2.txt
実行結果
2:banana
実行コマンド
grep -n "banana" file3.txt
実行結果
1:banana
3:banana
実行コマンド
grep -n "banana" file*.txt
実行結果
file1.txt:2:banana
file1.txt:4:banana
file2.txt:2:banana
file3.txt:1:banana
file3.txt:3:banana
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキスト検索を行うコマンド |
| -n | 一致した行の行番号を表示するオプション |
| file*.txt | file1.txt、file2.txt、file3.txt をまとめて指定 |
| 出力形式 | ファイル名:行番号:一致した行 |
| 利用用途 | 複数ファイルから対象文字列の位置を一覧確認する |
解説
grep -n を使用すると、一致した文字列の行番号を確認できます。
複数ファイルを同時に指定すると、ファイル名と行番号が表示されるため、該当箇所を素早く特定できます。
grepでディレクトリ配下を再帰検索しながら行番号を表示する
ファイル作成
cat << 'EOF' > input.txt
src/main.py:10:def main():
src/main.py:25:print("hello")
src/utils/helper.py:8:def helper():
docs/readme.md:15:grepの使い方
logs/app.log:100:ERROR failed
EOF
ファイル作成
mkdir -p src/utils docs logs
ファイル作成
awk -F: '{print $2 ":" $3}' input.txt > src/main.py
ファイル作成
awk -F: 'NR==3{print $2 ":" $3}' input.txt > src/utils/helper.py
ファイル作成
awk -F: 'NR==4{print $2 ":" $3}' input.txt > docs/readme.md
ファイル作成
awk -F: 'NR==5{print $2 ":" $3}' input.txt > logs/app.log
実行コマンド
grep -rn "grep" .
実行結果
src/main.py:4:15:grepの使い方
docs/readme.md:1:15:grepの使い方
実行コマンド
grep -rn "def" .
実行結果
src/utils/helper.py:1:8:def helper()
src/main.py:1:10:def main()
src/main.py:3:8:def helper()
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストを検索するコマンド |
| -r | ディレクトリ配下を再帰的に検索 |
| -n | 一致した行の行番号を表示 |
| "grep" | 検索対象の文字列 |
| . | カレントディレクトリ以下を検索 |
解説
grep -rn を使用すると、ディレクトリ配下を再帰的に検索しながら一致した行の行番号を表示できます。
ソースコード調査や設定ファイル検索でよく利用されます。
grepで単語一致時のみ行番号を表示する
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple pie
grape
apple
EOF
実行コマンド
grep -nx "apple" input.txt
実行結果
1:apple
6:apple
仕組み
| オプション | 説明 |
|---|---|
| grep | 指定した文字列を検索する |
| -n | 一致した行の行番号を表示する |
| -x | 行全体が検索文字列と完全一致した場合のみ一致とする |
| "apple" | 検索対象の文字列 |
| input.txt | 検索対象ファイル |
解説
-x を使用することで、apple pie のような部分一致を除外し、apple と完全一致する行だけを対象にできます。
-n を組み合わせることで、一致した行の行番号のみを確認できます。
grepで大文字小文字を無視して行番号を表示する
ファイル作成
cat << 'EOF' > input.txt
Apple
banana
APPLE
Orange
apple pie
EOF
実行コマンド
grep -in "apple" input.txt
実行結果
1:Apple
3:APPLE
5:apple pie
仕組み
| オプション | 説明 |
|---|---|
| grep | 指定した文字列を含む行を検索する |
| -i | 大文字・小文字を区別せずに検索する |
| -n | 一致した行の行番号を表示する |
| "apple" | 検索するキーワード |
| input.txt | 検索対象のファイル |
解説
grep -in を使用すると、大文字小文字を無視して検索し、一致した行の行番号も同時に表示できます。
ログ解析や設定ファイルの調査で対象行の位置を素早く特定する際に便利です。
grepで正規表現を使って特定パターンの行番号を検索する
ファイル作成
cat << 'EOF' > input.txt
apple
banana
error: file not found
orange
warning: low disk space
grape
error: permission denied
melon
EOF
実行コマンド
grep -n '^error:' input.txt
実行結果
3:error: file not found
7:error: permission denied
仕組み
| 要素 | 内容 |
|---|---|
| grep | テキストから条件に一致する行を検索するコマンド |
| -n | 一致した行の先頭に行番号を表示する |
| ^ | 行頭を表す正規表現 |
| error: | 検索対象の文字列 |
| '^error:' | 「error:」で始まる行のみを抽出する正規表現 |
解説
grep -n を使用すると、一致した行と行番号を同時に確認できます。
正規表現を組み合わせることで、ログファイルなどから特定パターンの行を効率よく検索できます。
grepで複数キーワードの行番号をOR条件で検索する
ファイル作成
cat << 'EOF' > input.txt
grepは文字列検索を行うコマンドです
sedは行編集を行います
行番号を表示したい場合は-nオプションを利用します
awkでも行番号を扱えます
grepで複数キーワードを検索できます
EOF
実行コマンド
grep -nE 'grep|行|番号' input.txt
実行結果
1:grepは文字列検索を行うコマンドです
2:sedは行編集を行います
3:行番号を表示したい場合は-nオプションを利用します
4:awkでも行番号を扱えます
5:grepで複数キーワードを検索できます
仕組み
| 要素 | 内容 |
|---|---|
| grep | テキスト検索コマンド |
| -n | 一致した行の先頭に行番号を表示 |
| -E | 拡張正規表現を有効化 |
| grep|行|番号 | OR条件(grep または 行 または 番号) |
| input.txt | 検索対象ファイル |
解説
grep -nE を使用すると、複数キーワードを | で連結して OR 条件検索できます。
一致した行には行番号が付与されるため、対象箇所を素早く特定できます。
grepで複数キーワードの行番号をAND条件で検索する
ファイル作成
cat << 'EOF' > input.txt
grepの基本的な使い方
grepで行番号を表示するには -n を使用
awkで行番号を扱う方法
grep 行番号 の組み合わせ例
grepで複数条件を検索
行番号付きでgrep検索を実行
sedとgrepを組み合わせる
grep 行 番号 を含むサンプル
grepのみを含む行
行番号のみを含む行
EOF
実行コマンド
grep -n 'grep' input.txt | grep '行' | grep '番号'
実行結果
2:grepで行番号を表示するには -n を使用
4:grep 行番号 の組み合わせ例
6:行番号付きでgrep検索を実行
8:grep 行 番号 を含むサンプル
仕組み
| 項目 | 内容 |
|---|---|
| grep -n 'grep' input.txt | grep を含む行を検索し、行番号を表示する |
| grep '行' | 前段の結果から 行 を含む行だけを抽出する |
| grep '番号' | さらに 番号 を含む行だけを抽出する |
| パイプ (|) | 前のコマンドの出力を次のコマンドへ渡す |
| AND検索 | すべての grep 条件を通過した行のみが残る |
解説
複数キーワードのAND検索は、grep をパイプで連結することで実現できます。
-n オプションを付与すると、一致した行の行番号を同時に確認できます。
grepで一致しない行番号を表示する方法
ファイル作成
cat << 'EOF' > input.txt
apple
orange
banana
grape
EOF
実行コマンド
grep -vn "apple" input.txt
実行結果
2:orange
3:banana
4:grape
仕組み
| オプション | 説明 |
|---|---|
| grep | パターン検索を行う |
| -v | 一致しない行を表示する |
| -n | 行番号を先頭に表示する |
| "apple" | 除外したい検索文字列 |
| input.txt | 検索対象ファイル |
解説
grepの-vは検索条件に一致しない行を抽出し、-nはその行番号を表示します。
そのため、一致しない行の番号と内容を同時に確認できます。
grepで行番号付きで前後の行を表示する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
banana
melon
banana
peach
EOF
実行コマンド
grep -n -B 1 -A 1 "banana" input.txt
実行結果
1-apple
2:banana
3-orange
4-grape
5:banana
6-melon
7:banana
8-peach
実行コマンド
grep -n -C 2 "banana" input.txt
実行結果
1-apple
2:banana
3-orange
4-grape
5:banana
6-melon
7:banana
8-peach
仕組み
| オプション | 説明 |
|---|---|
| -n | 一致した行に行番号を表示する |
| -B <数> | 一致行の前に指定した行数を表示する |
| -A <数> | 一致行の後に指定した行数を表示する |
| -C <数> | 一致行の前後に指定した行数を表示する |
解説
grep の -n オプションを使用すると一致した行の行番号を確認できます。
-A、-B、-C を組み合わせることで、一致行の前後の文脈もあわせて確認できます。
grepで最初に一致した行番号を取得する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
banana smoothie
grape
EOF
実行コマンド
grep -nm1 "banana" input.txt
実行結果
2:banana
実行コマンド
grep -nm1 "banana" input.txt | cut -d: -f1
実行結果
2
仕組み
| 項目 | 内容 |
|---|---|
| grep | パターンに一致する行を検索する |
| -n | 一致した行の行番号を表示する |
| -m1 | 最初の1件が見つかった時点で検索を終了する |
| cut -d: -f1 | 行番号:内容 の形式から行番号のみ取得する |
| 結果 | 最初に一致した banana の行番号 2 を取得できる |
解説
grep -n で行番号付きの検索結果を出力し、-m1 を組み合わせることで最初に一致した行だけを取得できます。
行番号のみが必要な場合は cut で抽出します。
grepで最後に一致した行番号を取得する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
banana
grape
banana
EOF
実行コマンド
grep -n 'banana' input.txt | tail -n 1
実行結果
6:banana
実行コマンド
grep -n 'banana' input.txt | tail -n 1 | cut -d: -f1
実行結果
6
仕組み
| 項目 | 内容 |
|---|---|
| grep -n | 一致した行を「行番号:内容」の形式で出力する |
| grep -n 'banana' input.txt | banana に一致する全行を取得する |
| tail -n 1 | 一致した結果の最後の1行を取得する |
| cut -d: -f1 | 区切り文字 : の前(行番号)だけを取得する |
| 結果 | 最後に一致した banana の行番号 6 を取得できる |
解説
grep 単体では最後に一致した行番号だけを直接取得できないため、tail -n 1 を組み合わせます。さらに cut を利用すると、行内容を除いた行番号のみを取得できます。
grepで一致した行番号だけをawkで抽出する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
banana
grape
banana
EOF
実行コマンド
grep -n 'banana' input.txt
実行結果
2:banana
4:banana
6:banana
実行コマンド
grep -n 'banana' input.txt | awk -F: '{print $1}'
実行結果
2
4
6
仕組み
| コマンド | 役割 |
|---|---|
| grep -n 'banana' input.txt | 一致した行と行番号を 行番号:内容 の形式で出力 |
| awk -F: '{print $1}' | 区切り文字を : にして1列目(行番号)だけを抽出 |
| grep -n 'banana' input.txt | awk -F: '{print $1}' | 一致した行番号のみを取得 |
解説
grepの-nオプションを使用すると一致した行に行番号を付与できます。
その出力をawkで加工することで、一致した行番号だけを簡単に抽出できます。
grepとsedで行番号を利用して特定行を編集する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
melon
EOF
実行コマンド
grep -n '^orange$' input.txt
実行結果
3:orange
実行コマンド
sed -i '' '3s/orange/lemon/' input.txt
実行コマンド
cat input.txt
実行結果
apple
banana
lemon
grape
melon
仕組み
| 項目 | 内容 |
|---|---|
| grep -n | 各行の先頭に行番号を付与して表示する |
| ^orange$ | 完全一致で orange の行を検索する |
| 3:orange | 3行目に orange が存在することを示す |
| sed '3s/orange/lemon/' | 3行目の orange を lemon に置換する |
| -i | ファイルを直接更新する |
解説
grep -n を利用すると対象文字列の行番号を確認できます。
確認した行番号を sed に渡すことで、特定行のみを安全に編集できます。
grepで巨大ファイルの行番号検索を高速化するコツ
ファイル作成
cat << 'EOF' > input.txt
INFO startup completed
INFO loading modules
ERROR database connection failed
INFO retrying connection
INFO retry successful
WARN disk usage 80%
INFO processing request
ERROR timeout detected
INFO processing request
INFO shutdown completed
EOF
実行コマンド
grep -n "ERROR" input.txt
実行結果
3:ERROR database connection failed
8:ERROR timeout detected
実行コマンド
LC_ALL=C grep -n "ERROR" input.txt
実行結果
3:ERROR database connection failed
8:ERROR timeout detected
実行コマンド
grep -n -m 1 "ERROR" input.txt
実行結果
3:ERROR database connection failed
仕組み
| コツ | 仕組み | 効果 |
|---|---|---|
| -n | 一致した行の行番号を同時に表示 | grep 行 番号の確認を即座に実施 |
| LC_ALL=C | ロケール処理を無効化しバイト単位で検索 | 巨大ファイル検索を高速化 |
| -m 1 | 指定件数で検索を打ち切る | 最初の一致だけ探す場合に高速 |
| 検索文字列を具体化 | 不要なマッチ判定を削減 | CPU負荷を低減 |
| 圧縮ファイル以外を対象化 | 展開処理を回避 | I/O時間を短縮 |
解説
巨大ファイルで grep 行 番号検索を行う場合は、LC_ALL=C によるロケール無効化が最も効果的な高速化手法の一つです。
最初の一致だけ必要な場合は -m オプションを併用すると無駄な走査を避けられます。
grepで行番号を表示するポイントまとめ
grepの行番号表示は、検索対象の位置を素早く把握するための基本機能です。
単一ファイルだけでなく複数ファイルやディレクトリ全体の検索にも活用できます。
また、正規表現や条件検索、awkやsedとの組み合わせによって、より高度なテキスト処理が可能になります。
grepの行番号機能を使いこなせれば、ログ解析や設定ファイルの確認作業を効率的に進められるようになります。

