はじめに

こんにちは!今回はgrepコマンドについて解説します。

grepは、ファイルやテキストから特定の文字列を検索するコマンドです。ログファイルからエラーを探したり、コードから特定の関数を見つけたり、めちゃくちゃ便利です。

grepコマンドとは

grepは、Global Regular Expression Print の略で、テキストから指定したパターンにマッチする行を抽出するコマンドです。

正規表現も使えるので、複雑な検索もできます。Linuxで最もよく使われるコマンドの1つです。

基本構文

1
grep [オプション] パターン [ファイル...]

主なオプション

オプション 説明
-i 大文字小文字を区別しない
-v マッチしない行を表示(反転)
-n 行番号を表示
-c マッチした行数を表示
-l マッチしたファイル名のみ表示
-r または -R ディレクトリを再帰的に検索
-w 単語全体にマッチ
-E 拡張正規表現を使用(egrepと同じ)
-A n マッチ行の後n行も表示
-B n マッチ行の前n行も表示
-C n マッチ行の前後n行を表示
--color マッチ部分を色付け

使用例

例1: 基本的な文字列検索

1
grep "error" app.log

実行結果:

1
2
2024-01-01 10:00:00 ERROR: Connection failed
2024-01-01 11:30:00 ERROR: Database timeout

ファイルから"error"を含む行を抽出します。

例2: 大文字小文字を区別しない検索

1
grep -i "error" app.log

実行結果:

1
2
3
2024-01-01 10:00:00 ERROR: Connection failed
2024-01-01 10:15:00 Error: Invalid input
2024-01-01 11:30:00 error: File not found

-iオプションで大文字小文字を無視します。

例3: 行番号を表示

1
grep -n "function" script.js

実行結果:

1
2
3
5:function init() {
12:function getData() {
25:function processData(data) {

どこにあるか一目瞭然です。

例4: マッチしない行を表示

1
grep -v "^#" config.conf

実行結果:

1
2
3
server_name = localhost
port = 8080
debug = true

-vで、コメント行(#で始まる行)を除外できます。設定ファイルの中身だけ見たい時に便利。

例5: マッチ数をカウント

1
grep -c "TODO" *.js

実行結果:

1
2
3
app.js:5
utils.js:3
config.js:1

各ファイルに何個TODOがあるか確認できます。

例6: ファイル名のみ表示

1
grep -l "password" *.txt

実行結果:

1
2
config.txt
secrets.txt

どのファイルに"password"が含まれてるかだけ知りたい時に。

例7: 再帰的に検索

1
grep -r "import" src/

実行結果:

1
2
3
src/app.js:import React from 'react';
src/utils.js:import axios from 'axios';
src/components/Header.js:import './Header.css';

ディレクトリ全体から検索できます。

例8: 単語全体にマッチ

1
grep -w "test" file.txt

“test"という単語だけにマッチし、“testing"や"contest"はマッチしません。

例9: 前後の行も表示

1
2
3
grep -A 2 "ERROR" app.log    # 後2行
grep -B 2 "ERROR" app.log    # 前2行
grep -C 2 "ERROR" app.log    # 前後2行

実行結果(-C 2の場合):

1
2
3
4
5
2024-01-01 09:59:58 INFO: Starting process
2024-01-01 09:59:59 INFO: Connecting to database
2024-01-01 10:00:00 ERROR: Connection failed
2024-01-01 10:00:01 INFO: Retrying...
2024-01-01 10:00:02 INFO: Connection established

エラーの前後も見られるので、原因が分かりやすいです。

例10: 複数のパターンを検索

1
grep -E "error|warning|critical" app.log

実行結果:

1
2
3
2024-01-01 10:00:00 ERROR: Connection failed
2024-01-01 10:05:00 WARNING: Low memory
2024-01-01 11:00:00 CRITICAL: System overload

-Eで拡張正規表現が使えます。

例11: パイプと組み合わせ

1
ps aux | grep "node"

実行結果:

1
2
user  1234  0.5  2.0  node app.js
user  5678  0.3  1.5  node server.js

他のコマンドの出力からも検索できます。

例12: 正規表現を使った検索

1
2
3
4
grep "^error" app.log         # errorで始まる行
grep "error$" app.log         # errorで終わる行
grep "^$" file.txt            # 空行
grep "[0-9]\{3\}-[0-9]\{4\}" contacts.txt  # 電話番号パターン

正規表現で複雑なパターンも検索できます。

よく使うパターン

ログファイルからエラーを検索

1
grep -i "error\|fail\|exception" /var/log/app.log

エラー関連のキーワードをまとめて検索。

コメント行と空行を除外

1
grep -v "^#" config.conf | grep -v "^$"

または

1
grep -E -v "^#|^$" config.conf

設定ファイルの有効な行だけ表示します。

特定の拡張子のファイルから検索

1
grep -r --include="*.js" "function" .

JavaScriptファイルだけから検索。

特定のディレクトリを除外

1
grep -r --exclude-dir=node_modules "TODO" .

node_modulesは除外してTODOを検索。

Tips・注意点

  • 色付き表示: --color=autoで見やすくなる

    1
    
    grep --color=auto "error" app.log
    
  • エイリアスに設定: .bashrcに追加すると便利

    1
    
    alias grep='grep --color=auto'
    
  • バイナリファイルは警告が出る: テキストファイル専用

    1
    
    grep "text" binary_file  # Binary file ... matches
    
  • 正規表現のエスケープ: 特殊文字は\でエスケープ

    1
    
    grep "\." file.txt  # ドットをリテラルとして検索
    
  • grepとegrepとfgrepの違い:

    • grep: 基本正規表現
    • egrep = grep -E: 拡張正規表現
    • fgrep = grep -F: 固定文字列(正規表現を使わない、高速)

実践的な使い方

アクセスログから特定のIPを抽出

1
grep "192.168.1.100" /var/log/apache2/access.log

エラーが多い時間帯を調べる

1
grep "ERROR" app.log | cut -d' ' -f1-2 | sort | uniq -c

実行結果:

1
2
3
  5 2024-01-01 10:00:00
 12 2024-01-01 11:00:00
  3 2024-01-01 12:00:00

コード内のTODOをカウント

1
grep -r "TODO" src/ | wc -l

プロジェクト内のTODOの数を確認。

複数ファイルから関数定義を検索

1
grep -rn "^function\|^const.*=.*=>" src/

JavaScriptの関数定義を探す。

ログファイルから特定期間のエラーを抽出

1
grep "2024-01-01 1[0-2]:" app.log | grep -i "error"

10時〜12時のエラーだけ抽出。

プロセス確認(psと組み合わせ)

1
ps aux | grep [n]ode

[n]odeとすることで、grep自身のプロセスは除外されます。

設定ファイルの有効な設定だけ表示

1
grep -E "^[^#]" /etc/ssh/sshd_config | grep -v "^$"

コメントと空行を除外。

ファイルの差分確認(簡易版)

1
grep -Fxvf file1.txt file2.txt

file2にあってfile1にない行を表示。

ディレクトリ内の全ファイルでエラーをカウント

1
find . -name "*.log" -exec grep -c "ERROR" {} \; | awk '{sum+=$1} END {print sum}'

環境変数から特定の値を検索

1
env | grep -i "path"

Gitのコミットメッセージを検索

1
git log --all --oneline | grep "fix"

まとめ

今回はgrepコマンドについて解説しました。

ポイント:

  • grepでテキストから文字列やパターンを検索できる
  • -iで大文字小文字を区別しない
  • -rで再帰的にディレクトリを検索
  • -vで反転(マッチしない行を表示)
  • -nで行番号を表示
  • -Eで拡張正規表現が使える
  • パイプと組み合わせて強力な検索が可能

grepはLinuxの基本中の基本です。ログ解析、コード検索、設定ファイルの確認など、あらゆる場面で使います。正規表現を覚えると、さらに強力になりますよ。

次回もLinuxコマンドの学習を続けていきましょう!