grepで行頭を条件に検索できるようになると、設定ファイルやログから必要な行を素早く抽出できます。
しかし、正規表現の意味や記号の使い方でつまずく初学者は少なくありません。
本記事では、基本から応用までを詳しく解説します
参考:GNU grep
grepで行頭を指定する基本構文
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apricot
grape
Apple
avocado
EOF
実行コマンド
grep '^a' input.txt
実行結果
apple
apricot
avocado
実行コマンド
grep '^A' input.txt
実行結果
Apple
仕組み
| 項目 | 内容 |
|---|---|
| grep | 条件に一致する行を検索するコマンド |
| ^ | 行頭(各行の先頭)を表す正規表現 |
| ^a | 行頭が小文字の a で始まる行に一致 |
| ^A | 行頭が大文字の A で始まる行に一致 |
| grep '^a' input.txt | input.txt の中から先頭が a の行だけを表示 |
解説
^ は正規表現で「行頭」を意味します。
grep '^文字列' を使うことで、指定した文字列から始まる行だけを効率よく抽出できます。
grepで行頭が特定の文字列で始まる行を検索
ファイル作成
cat << 'EOF' > input.txt
apple red
banana yellow
apple green
orange orange
apple pie
grape purple
EOF
実行コマンド
grep '^apple' input.txt
実行結果
apple red
apple green
apple pie
仕組み
| 仕組み | 内容 |
|---|---|
| grep | 指定したパターンに一致する行を検索するコマンド |
| ^ | 行頭(1文字目)を表す正規表現 |
| ^apple | 行頭が apple で始まる行だけに一致する |
| input.txt | 検索対象のファイル |
解説
grep '^apple' input.txt は、^ を利用して「行頭が apple で始まる行」のみを抽出します。
行の途中に apple が含まれるだけの行は一致せず、先頭から始まる行だけが表示されます。
grepで行頭が複数の文字列に一致する行を検索
ファイル作成
cat << 'EOF' > input.txt
apple red
banana yellow
cherry red
apple green
banana brown
grape purple
orange orange
EOF
実行コマンド
grep -E '^(apple|banana)' input.txt
実行結果
apple red
banana yellow
apple green
banana brown
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストから条件に一致する行を検索するコマンド |
| -E | 拡張正規表現を有効にし、|や()を使用できるようにする |
| ^ | 行頭を表すアンカー |
| (apple|banana) | apple または banana のどちらかに一致する |
| ^(apple|banana) | 行頭が apple または banana で始まる行だけを検索する |
解説
^で行頭を指定し、-Eと|を組み合わせることで複数の文字列をOR条件で検索できます。
行頭一致の条件を増やしたい場合は、(apple|banana|orange)のように追加するだけです。
grepで行頭が特定の1文字で始まる行を検索
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apricot
cherry
avocado
blueberry
EOF
実行コマンド
grep '^a' input.txt
実行結果
apple
apricot
avocado
仕組み
| 項目 | 内容 |
|---|---|
| grep | 条件に一致する行を検索するコマンド |
| ^ | 行頭(各行の先頭)を表す正規表現 |
| a | 行頭が a で始まる行を検索する文字 |
| '^a' | 「行頭が a の行」という検索パターン |
| input.txt | 検索対象のファイル |
解説
^ は正規表現で「行頭」を意味します。
grep '^a' input.txt を実行すると、各行の先頭が a の行だけを抽出できます。
grepで行頭が数字で始まる行を検索
ファイル作成
cat << 'EOF' > input.txt
123 apple
abc orange
456 banana
789 grape
xyz lemon
10 melon
EOF
実行コマンド
grep '^[0-9]' input.txt
実行結果
123 apple
456 banana
789 grape
10 melon
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定したパターンに一致する行を検索するコマンド |
| ^ | 行頭を表すメタ文字 |
| [0-9] | 0〜9の数字を1文字表す文字クラス |
| ^[0-9] | 「行頭が数字で始まる」という条件を表す正規表現 |
解説
grep '^[0-9]' は、行頭 (^) が数字 ([0-9]) の行だけを抽出します。
ログやCSVなどから、数字で始まるデータ行だけを簡単に検索できます。
grepで行頭が空白から始まる行を検索
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
melon
peach
EOF
実行コマンド
grep '^[[:space:]]' input.txt
実行結果
banana
grape
peach
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストから条件に一致する行を検索するコマンド |
| ^ | 行頭を表すアンカー |
| [[:space:]] | 半角スペースやタブなどの空白文字を表すPOSIX文字クラス |
| ^[[:space:]] | 行頭が空白文字で始まる行に一致する正規表現 |
解説
^で行頭を指定し、[[:space:]]で空白文字(スペース・タブなど)を表しています。
これにより、行頭が空白から始まる行だけを抽出できます。
grepで行頭のコメント行を検索
ファイル作成
cat << 'EOF' > input.txt
# comment1
name=alice
# comment2
age=20
# comment3
city=Tokyo
## comment4
email=alice@example.com
EOF
実行コマンド
grep '^#' input.txt
実行結果
# comment1
# comment2
# comment3
## comment4
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストから条件に一致する行を検索するコマンド |
| ^ | 行頭を表すメタ文字 |
| # | コメント行の先頭文字として検索対象にする文字 |
| '^#' | 行頭が # の行だけに一致する正規表現 |
| grep '^#' input.txt | input.txt から行頭が # のコメント行だけを表示する |
解説
^ を使用することで、# が行頭にある行だけを検索できます。
設定ファイルやシェルスクリプトからコメント行だけを抽出したい場合によく利用されます。
grepで行頭の空行を検索する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
melon
EOF
実行コマンド
grep -n '^$' input.txt
実行結果
1:
4:
7:
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定したパターンに一致する行を検索するコマンド |
| ^ | 行頭を表すメタ文字 |
| $ | 行末を表すメタ文字 |
| ^$ | 行頭から行末まで文字が存在しない行(空行)に一致 |
| -n | 一致した行番号も表示するオプション |
解説
空行は「行頭の直後に行末がある状態」のため、^$ を指定すると空行だけを検索できます。
-n を付けると、空行がある行番号も確認できます。
grepで行頭と行末を組み合わせて検索
ファイル作成
cat << 'EOF' > input.txt
error
error.log
access.log
error.txt
system error
error.log.old
debug.log
error.log
EOF
実行コマンド
grep '^error' input.txt
実行結果
error
error.log
error.txt
error.log.old
error.log
実行コマンド
grep 'log$' input.txt
実行結果
error.log
access.log
debug.log
error.log
実行コマンド
grep '^error.*log$' input.txt
実行結果
error.log
error.log
仕組み
| 項目 | 内容 |
|---|---|
| ^ | 行頭を表し、指定した文字列で始まる行に一致する |
| $ | 行末を表し、指定した文字列で終わる行に一致する |
| .* | 任意の0文字以上の文字列に一致する |
| ^error.*log$ | errorで始まりlogで終わる行だけを検索する |
解説
grepでは^と$を組み合わせることで、行頭・行末の両方を条件にした柔軟な検索ができます。
ログファイル名や特定の命名規則に一致する行を抽出する際によく利用されます。
grepで行頭に一致しない行を検索する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
#comment
123apple
EOF
実行コマンド
grep -v '^[[:space:]]' input.txt
実行結果
apple
banana
grape
#comment
123apple
仕組み
| 項目 | 内容 |
|---|---|
| grep | パターンに一致する行を検索するコマンド |
| ^ | 行頭を表すアンカー |
| [[:space:]] | 半角スペースやタブなどの空白文字 |
| ^[[:space:]] | 行頭が空白文字で始まる行に一致 |
| -v | 一致した行を除外し、一致しない行を表示 |
解説
grep -v '^[[:space:]]'は、行頭が空白で始まる行を除外し、それ以外の行を表示します。
行頭に空白がある行だけを除外したい場合に便利な指定方法です。
grepで行頭一致検索と-E(拡張正規表現)の使い分け
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apricot
grape
application
pineapple
EOF
実行コマンド
grep '^app' input.txt
実行結果
apple
application
実行コマンド
grep -E '^apple|grape$' input.txt
実行結果
apple
grape
仕組み
| コマンド | 仕組み | 特徴 |
|---|---|---|
| grep '^app' input.txt | ^は行頭を表し、「app」で始まる行だけを検索する。 | 単純な行頭一致検索なら通常のgrepで十分。 |
| grep -E '^apple|grape$' input.txt | -Eは拡張正規表現を有効にし、|でOR条件を指定する。^appleは「appleで始まる行」、grape$は「grapeで終わる行」を検索する。 | 複数条件のOR検索などを簡潔に記述できる。 |
解説
行頭一致だけであれば^を使う通常のgrepで十分です。
複数条件のOR検索など拡張正規表現が必要な場合はgrep -Eを使用すると簡潔に記述できます。
grepで行頭一致検索を再帰的に実行する方法
ファイル作成
mkdir -p sample/dir1 sample/dir2
ファイル作成
cat << 'EOF' > sample/dir1/file1.txt
error: failed
warning: disk
error: timeout
info: ok
EOF
ファイル作成
cat << 'EOF' > sample/dir2/file2.txt
error: network
info: connected
warning: memory
EOF
実行コマンド
grep -r '^error' sample
実行結果
sample/dir2/file2.txt:error: network
sample/dir1/file1.txt:error: failed
sample/dir1/file1.txt:error: timeout
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストを検索するコマンド |
| -r | ディレクトリを再帰的に検索する |
| ^ | 正規表現で行頭を表す |
| ^error | 行頭が error の行だけに一致する |
| sample | 検索対象ディレクトリ |
解説
grep -r '^error' を使うことで、指定ディレクトリ配下のすべてのファイルから行頭が error の行だけを再帰的に検索できます。
^ は正規表現の行頭アンカーであり、前方一致検索に利用されます。
grepで行頭一致検索をfindコマンドと組み合わせる方法
ファイル作成
cat << 'EOF' > input.txt
error: Disk full
warning: Low memory
success: Backup completed
error: Permission denied
info: Service started
EOF
実行コマンド
find . -name "input.txt" -exec grep '^error' {} \;
実行結果
error: Disk full
error: Permission denied
仕組み
| 項目 | 内容 |
|---|---|
| find . | カレントディレクトリ以下を検索する |
| -name "input.txt" | input.txtという名前のファイルを検索する |
| -exec ... {} \; | 見つかったファイルごとにコマンドを実行する |
| grep '^error' | ^で行頭を表し、errorで始まる行のみを抽出する |
| {} | findで見つかったファイル名に置き換えられる |
解説
grepの^を使うことで、指定した文字列で始まる行だけを検索できます。
findと組み合わせると、複数ファイルに対して行頭一致検索を一括実行できます。
grepで行頭検索がうまくいかない原因と対処法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
Apple
grape
EOF
実行コマンド
grep "^apple" input.txt
実行結果
apple
apple pie
実行コマンド
grep "^Apple" input.txt
実行結果
Apple
実行コマンド
grep "^ banana" input.txt
実行結果
banana
実行コマンド
grep "^apple" input.txt | cat -n
実行結果
1 apple
2 apple pie
仕組み
| 項目 | 内容 |
|---|---|
| ^ | 行頭を表すアンカー。行の先頭から一致する文字列のみ検索する。 |
| ^apple | 行頭がappleで始まる行だけを抽出する。 |
| 大文字・小文字 | appleとAppleは別文字として扱われるため一致しない。 |
| 行頭の空白 | 行頭にスペースがある場合は、そのスペースも含めて検索条件を書く必要がある。 |
| 行頭検索がうまくいかない原因 | 行頭に空白やタブがある、検索文字列の大文字・小文字が異なる、^をクォートせずシェル展開の影響を受けるケースなど。 |
解説
grepの^は「行頭」を意味するアンカーであり、先頭から一致する文字列だけを検索します。期待どおりにヒットしない場合は、行頭の空白や大文字・小文字の違いを確認すると原因を特定しやすくなります。
grepで行頭検索を理解して使いこなすためのまとめ
grepで行頭検索を理解すると、必要なデータを効率よく抽出できるようになります。
まずは基本構文を身につけて実行していくことが理解への近道です。
