PowerShell Grep コマンド
Aug 25, 2025
Unix/Linux grep コマンドは、ログ分析、コードスキャン、システム診断に使われる汎用的なテキスト検索ユーティリティです。大文字と小文字を区別しない検索、再帰的なディレクトリ走査、反転マッチ、行番号、さらに lookahead や lookbehind のような高度な正規表現パターンをサポートします。Windows では、PowerShell の Select-String が同等の役割を担い、ファイル、ストリーム、オートメーション スクリプト全体で高速なパターン一致を可能にします。
Grep(Global Regular Expression print)コマンドは、Unix/Linux システムで使える強力なテキスト検索ユーティリティです。Grep は、正規表現や文字列のようなパターンを受け取り、期待されるパターンを含む行を、1 つ以上の入力ファイルから検索します。Grep コマンドは、テキスト検索やフィルタリング、ログ分析、コードスキャン、設定管理、データ抽出などに大きく活用できます。ソフトウェア開発では、テキスト検索はコードナビゲーション、リファクタリング、デバッグ、エラー診断、セキュリティ上の脅威スキャン、バージョン管理、コードレビューに用いられます。テキスト検索ツールは、特定の関数、変数、またはエラーメッセージを見つけるために開発者が費やす時間を大幅に削減します。システム管理では、ログ分析や監視、セキュリティ/脅威検知、データ処理、オートメーションといった特定の作業で、テキスト検索が役に立ちます。grep、awk、sed のようなテキスト処理ツールはログをスキャンして認証イベントや特定の例外を分析するために使われ、重大度、タイムスタンプ、キーワードなどでログをフィルタリングすることで、管理者が障害、セキュリティ侵害、パフォーマンス問題を検知しやすくなります。このブログでは、Grep の機能、具体例、ユースケースを包括的に解説します。Select-String は、正規表現によるマッチングを用いてファイルや入力の中からテキストパターンを検索することで、Windows における PowerShell の grep として利用できます。
Netwrix Auditor for Active Directory
Active Directory で何が起きているかを、完全に可視化します
基本的な構文と使い方
grep コマンドは、Unix/Linux でテキストパターンを検索し、テキストのフィルタリングや分析を行うための強力なツールです。以下は、パターン、ファイル、オプションを含む基本的なコマンド構造です。
grep [options] pattern [file…]
- パターン: 検索する正規表現のテキスト。
- ファイル: 検索するファイル、または複数のファイル。
- オプション: grep の動作を変更する修飾子またはスイッチです。オプションは通常、ハイフン(-)の後に指定します。
以下は、最もよく使用されるオプションの一部です。
- -i: 検索パターンとデータにおける大文字・小文字を区別しません。たとえば、以下のコマンドは「hello」「HELLO」「Hello」などを検索します。
grep -i “hello” file.txt
- -v: 検索の一致結果を反転し、指定したパターンに一致しない行を表示します。たとえば、以下のコマンドでは「hello」を含まない行を表示します。このオプションは、特定の条件に一致しない行を見つけるのに役立ちます。
grep -v “hello” file.txt
- -n: 条件に一致する各行の前に行番号を表示し、レポート共有に役立ちます。たとえば、以下のコマンドでは「function」という単語が出現する行番号を表示します。
grep -n “function” file.txt
- -r: ディレクトリを再帰的に検索します。つまり、ディレクトリおよびそのサブディレクトリ内のすべてのファイルでパターンを検索します。
- –color: 出力内で一致する文字列を強調表示します。たとえば、以下のコマンドは出力内の “hello” を強調表示します。
grep –color “hello” file.txt
- -l: 少なくとも1件の一致が含まれるファイル名だけを表示します。
grep -l “starting” *.log
プラットフォームの互換性
Grep は Unix/Linux システムのコマンドラインにデフォルトで統合されており、期待どおりに一貫した動作をします。正規表現に対応し、パイピング(piping)をサポートし、他の Unix/Linux ツールともシームレスに統合できます。Grep は Windows システムでは Windows subsystem for Linux (WSL) を通じて利用でき、これによりユーザーは仮想マシンのオーバーヘッドなしで windows 上で直接 GNU/Linux 環境を実行できます。さらに、Git Bash や Gnuwin32 のように、windows でそのまま実行できるようコンパイルされたスタンドアロン版の grep もいくつか用意されています。
grep はプラットフォーム間で一貫するように設計されていますが、異なるプラットフォームで使用する際には、いくつかの違いと制限に注意する必要があります。
- 改行コード: Unix/Linux システムでは行末に ‘\n’ を使用しますが、windows では ‘\r\n’ を使用します。
- パス指定: ファイルシステムの挙動は Unix/Linux と windows で異なります。windows のパスでは、Unix/Linux で使われる ‘/’ の代わりにバックスラッシュ ‘\’ を使用します。
- 文字エンコーディング: 異なるプラットフォームでは既定の文字エンコーディングが異なり、特に非 ASCII テキストを扱う場合に影響します。
- コマンドライン オプション: ほとんどの一般的な grep オプションは、さまざまなプラットフォームでサポートされています。ただし、プラットフォームによっては grep の対応が限定的な場合があります。たとえば Windows ではパイプ(piping)のサポートが限定的です。
grep の実践的な使用例
シンプルなテキスト検索
次の例では、ログファイル内で文字列「deployment」を検索します。
Grep “deployment” logemail.log
次の例では、大小文字の違いを無視するオプション -i を使って文字列「starting」を検索しています。
grep -i “starting” logemail.log
一方で、-i オプションを使わない場合は、ファイル全体で完全に一致する文字列が検索されます。つまり grep “Starting” logemail.log のコマンドは Starting を検索し、「starting」や「STARTING」などの一致、または文字列「starting」の大小文字を区別したその他の組み合わせは無視します。
再帰検索
場合によっては、ファイルが別々のディレクトリに分散しており、複数のファイルやディレクトリにまたがってパターン検索を実行する必要があります。-r オプションに加えて --include および --exclude を使って grep で再帰検索を行うと、素早い解決策になります。次のコマンドでは、現在のディレクトリおよびそのサブディレクトリ内にあるすべての .log ファイルについて、パターン「starting」を再帰的に検索し、パターンが一致したログファイルからは最初の1件だけを出力します。現在は「Documents」ディレクトリにおり、サブディレクトリの「office」と「project」があります。
grep -r “starting” –include=”*.log” -m1 –color=always
次の例では、すべてのログファイルを除外し、ディレクトリ“Documents”およびそのサブディレクトリ内のすべてのファイルから文字列“starting”を再帰的に検索します。
Grep -r “starting” –exclude=”*.log”
一致の反転
-v オプションを使って検索結果を反転できます。これにより、文字列を検索し、その文字列を含まないすべての行を見つけられます。次の例では、オプション -v を使って検索文字列“starting”を対象にし、“starting”を含まないすべての行を探しています。
Grep -v “starting” logmail.log
行番号とコンテキスト出力:
ファイル内でパターンを検索する場合、検索パターンが含まれる正確な行番号が分かると便利です。場合によっては、検索一致の周辺の文脈(コンテキスト)も含めて見るほうがよいことがあります。たとえば、ログファイルを調べて例外を探索する場合は、検索文字列の前後にいくつかの行が検索結果に含まれていると、より適切です。次の例では、-n オプションを使用して、行番号を一致するパターンと一緒に出力します。
Grep -n “starting” logemail.log
オプション -A を使うと、マッチした結果の後に続く行を出力できます。オプション -B を使うと、マッチした結果の前にあるいくつかの行を出力できます。また -C を使うと、検索結果の前後にあるいくつかの行を出力できます。以下の例では、-A、-B、-C を使って検索結果の前後の行を表示しています。
grep -A 2 “starting” logemail.log
grep -B 2 “starting” logemail.log
Grep -C 1 “starting” logemail.log
grep で正規表現を使う
正規表現(Regular expression)とは、検索パターンを定義する文字の並びです。文字列の照合や操作に使用されます。基本的な正規表現は次のとおりです。
- ドット(.): 改行を除く任意の1文字に一致します。例:「c.t」は cat、cot、crt、cet などに一致します。
- アスタリスク(*): 直前の文字が 0 回以上繰り返される部分に一致します。例:「c*t」は ct、cat、caat、caaat などに一致します。
- キャレット(^): 行頭に一致します。例:「^an」は行の先頭にある場合のみ「an」に一致します。
- ドル記号($): 行末に一致します。例:「$finished」は行末にある場合のみ「finished」に一致します。
- パイプ(|): 正規表現でパイプ記号(|)は論理 OR として働きます。つまり、(apple | banana) はその行で apple または banana のいずれかに一致します。
- エスケープ文字 (\): 特殊文字をエスケープします。例:\ . リテラルのドットに一致します。
Grep は正規表現をサポートしています。基本正規表現(BRE)を使用し、さらに -E フラグで拡張正規表現(ERE)、-P フラグで Perl 互換の正規表現(PCERE)にも対応しています。拡張正規表現では、+(1 回以上の一致)、?(0 回または 1 回の一致)、|(論理 OR)、{}(グループ化パターン)などの追加メタキャラクターが用意されており、より高度なパターン検索が可能です。Perl 互換の正規表現は最も強力で柔軟で、(?=) の先読み(lookahead)、(?<! ) の後読み(lookbehinds)、(?:pattern) のノンキャプチャグループなど、さらに多くのオプションを提供します。
以下の例では、ファイル内の「単語全体」を検索し、文字列マッチングを使った grep コマンドのバリエーションを確認します。
- Grep “end” log.txt では、end という単語の考えられるあらゆるバリエーションに一致します。
- grep -w “end” log.txt、一致するのは単語 “end” 全体のみです。
- grep “\bend\b” log.txt, 正規表現を使用して単語“end”の完全一致のみを検索します。
- Grep “\bend” log.txt, 行の先頭にある文字列“end”を一致させます。
次の例では、ファイル“log.txt”内の数字をさまざまなパターンで照合します。
- grep “[0-9]” log.txt, 数字を含むすべての行を見つけます。
- grep “[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}” log.txt , 指定されたファイル内の電話番号を見つけます。
- grep -E “[0-9]{2,4}” log.txt , 連続した数字が2個、3個、または4個含まれる行を見つけます。
次の例では、ファイル log.txt 内の空白(whitespace)を探しています。
- grep “^[[:space:]]” log.txt 行の先頭にあるスペースを見つけます。
- grep “^[[:space:]]” log.txt 行末にあるスペースを見つけます。
grep コマンドを使うことで、IPアドレスやメールなどの複雑なパターンを見つけることができます。次の例では、正規表現を使用して IP アドレスを探しています。
grep -E “\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}” log.txt
次の例では、正規表現を使用してメールアドレスを見つけます。
grep -E “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}” log.txt
高度な正規表現テクニック(例:-P を使った先読み(lookahead)と後読み(lookbehind))
先読み(lookahead)と後読み(lookbehind)は、その周辺にあるパターンに基づいてパターンを見つけるための強力なテクニックです。たとえば、ログファイル内で“error”を検索したいが、その行にアプリケーションの起動も同時に記載されている場合に限りたい、というケースです。先読みには2種類あり、正の先読み(Positive lookahead)と負の先読み(Negative lookahead)があります。
- 正の先読み(Positive lookahead ?=…)は、括弧内のパターンが現在位置の後に続くことを保証しますが、マッチにはそれを含めません。つまり、ログ行で「error」の直後に単語「starting」が続く場合に「error」を検索できる、ということです。
- 負の先読み(Negative lookahead((?!…)は、括弧内のパターンが現在位置の後に続かないことを保証します。つまり、「starting」は検索できますが、その後に「error」が続くものは除外されます。
grep -P “error(?= starting)” log.txt
grep -P “starting(?!= error)” log.txt
lookbehind には 2 種類あります。Positive lookbehind と Negative lookbehind です。
- 正の後読み (?<=…) は、括弧内のパターンが現在の位置より前にあることを保証しますが、マッチには含めません。
- 否定の後読み (?<!…) は、括弧内のパターンが現在の位置より前に存在しないことを保証します。
Grep -P “(?<=starting )error” log.txt
grep -P “error)?=.*starting)” log.txt
grep の高度な機能
複数のパターンを組み合わせる
grep コマンドを使うと、検索対象の複数パターンを組み合わせることもできます。-e オプションを使って複数のパターンを組み合わせます。次の例では、1つのファイル内で2つの異なるパターンを検索しています。
Grep -e “starting” -e “error” log.txt
また、-e を使って複数のファイル内で複数のパターンを見つけることもできます。たとえば log.txt では “starting”、logemail.log では “error” を探すようにします。
grep -e “starting” -e “error” log.txt logemail.log
出力のカスタマイズ
–color オプションを使用すると、出力をコンソールに表示する場合でもファイルにリダイレクトする場合でも、検索したパターンを出力内で強調表示できます。
- –color=auto は、出力が端末に送られるかどうかに応じて色を使うかどうかを決定します
- –color=always:常に色を使用します。出力がファイルにリダイレクトされていても、色を使い続けます。
- –color=never:決して色を使いません。
grep –color=auto “error” log.txt
grep –color=always “error” log.txt
grep –color=never “error” log.txt
grep コマンドの出力を変更して、静かに動作させるには -q オプションを使えます。-q オプションを使用すると、すべての一致行は出力されず、指定したカスタムメッセージだけが表示されます。以下の例では、log.txt ファイル内でパターン “error” を見つけて “error found” を出力しています。
grep -q “error” log.txt && echo “error found!” || echo “No error found”
if grep -qi “error” log.txt; then echo ” error found”; fi
パフォーマンス最適化
grep は大きなファイルをメモリに完全に読み込むことなく読み取りますが、追加のテクニックによってパフォーマンスをさらに向上させることができます。
- 正規表現の使いすぎ: 正規表現(Regex)は計算コストが高いため、リテラル文字列を探しているような状況では、Regexの計算によるオーバーヘッドを避けるために固定文字列のgrepを使用できます。
- –mmap の使用: ファイル内で多くのランダムアクセスを行う場合、–mmap を使うことでメモリマップされたファイルアクセスを有効にできます。
- 並列処理: タスクによって大きなファイルを分割し、異なる部分に対して複数の grep プロセスを実行できる場合は、性能最適化に役立つことがあります。複数の grep プロセスを同時に実行し、後で結果を結合できるためです。
- 出力の制限: 出力を制限して、検索結果の最初のまたは2番目の出現だけを表示することもできますし、出力を抑制してパターンの存在だけを確認することもできます。
Grep コマンドはデフォルトで出力をバッファリングするため、パイプライン内でコマンドをつなげるとリアルタイム処理が遅れることがあります。 “–line-buffered” オプションは、各マッチごとに即座に出力するよう強制するために使用します。次の例では、tail と grep を連結してログファイルを継続的に監視し、パターン “error” を行ごとに出力します。
Tail -f log.txt | grep –line-buffered “error”
ファイルベースのパターンマッチ
grep コマンドを使って検索するパターンのファイルを作成し、その後 –file を使って、そのファイルから複数のパターンを検索できます。次の例では、「starting」、「application」、「INFO」というパターンを含む pattern.txt ファイルを作成し、grep コマンドで –file を使って、-m2 オプションにより2回出現した箇所を表示するようにファイル logemail.log 内のこれらのパターンを検索しています。
grep –file=pattern.txt -m2 logemai.log
grep によるパイプとリダイレクト
grep コマンドは、ほかのコマンドと組み合わせてさまざまなシナリオで利用できます。以下のコマンドでは、プロセスの状態(ps)コマンドで全プロセスを取得し、それを grep にパイプして、python プロセスだけを表示します。
ps aux | grep python
次の例では、現在のディレクトリ内のすべてのファイルとフォルダーを取得し、grep コマンドでログファイルのみをフィルタリングします。
ls -a | grep ‘\.log$’
次の例では、ps、grep、awk コマンドを使って、Python プロセスを使用しているユーザー名を出力します。
ps aux | grep python | awk ‘{print $1}’
次の例では、erros.txt ファイル内でパターン「error」を見つけ、sed コマンドを使って「error」の出現箇所すべてを「Alert」として強調表示します。
grep “error” erros.txt | sed ‘s/error/ALERT/’
以下の例では、ファイル log.txt 内でパターン “error” を検索し、出力を現在のディレクトリにある別のファイル erros.txt にリダイレクトしています。最初のコマンドでは errors.txt ファイルの出力を上書きし、2つ目のコマンドでは error.txt ファイルに grep の出力を追記しています。
grep “error” log.txt > errors.txt
grep “error” logemail.log >> errors.txt
次のコマンドでは、tee を使用して grep の出力を erros.txt ファイルに書き込みつつ、同時にコンソールにも表示します。
grep “starting” logemail.log | tee errors.txt
実際のユースケースと例
ログファイルの解析とフィルタリング
(上でたくさんの例を示しているので)
データファイルからのテキスト処理と抽出
(上にたくさんの例を挙げました)
netstat および ss コマンドを使うことで、さまざまなポートの状態と、それらのポートで待ち受け(リッスン)しているプロセスを確認できます。さらに grep と組み合わせることで、結果を絞り込み、特定のポートに限定することも可能です。以下の例では、netstat および ss コマンドを使用して、さまざまなポートで待ち受けしているすべてのプロセスを取得します。
netstat -lntp | grep “LISTEN”
ss -lntp | grep “LISTEN”
grep コマンドを他のコマンドと組み合わせることで、システム情報を取得し、さまざまな設定をすばやく検索できます。以下の例では、診断目的に役立つさまざまなシステム情報を確認します。
ps aux | grep “CPU” # CPU の統計を確認する。
df -h | grep “/dev/sd” # ディスク使用量を確認する。
ip a | grep “inet” # IP アドレスを見つける
grep のカスタマイズとエイリアス
異なるオプションを持つ grep コマンドのエイリアスを定義し、パターンを検索する際には、オプション付きの grep コマンドの代わりにこれらのエイリアスを使用できます。
alias g=’grep’
alias gi=’grep -i’
alias gr=’grep -r’
alias gc=’gr -n –color=auto’
これらのエイリアスを定義した後は、エイリアスだけでパターン検索を実行できます。
g “error” -m1 log.txt
gi “error” -m1 log.txt
gr “error” -m1 log.txt
gc “error” -m1 log.txt
最初の10件のシステムログを読み取る関数を作成できます。次の例では、場所が “/var/log/systemlog” の syslog ファイルを読み取り、パターン “error” を含む最後の10行を出力する関数 “find_error” を作成します。
find_errors{
grep -I “error” /var/log/syslog | tail -n 10
}
Find_errors
tail、grep、tee コマンドを使用して syslog を検索し、「error」というキーワードでエラーをフィルタリングして、出力をコンソールに表示し、ログファイルにも追加します。
tail -f /var/log/syslog | grep –line-buffered -i “error” | tee errors.txt
シェルスクリプトとの統合(条件文とループで grep を使用する)
自動化のためにシェルスクリプト内で grep を使う例
(このセクションはかなり複雑で、Linux 環境でより多くの VM と Windows のセットアップが必要です。例を共有する時間がなかったため、H2 を「Using grep with conditional statements and loops」に変更することを提案します)
次の例では、grep -i を使って特定のパターンを検索し、出力を while ループにパイプしてから、マッチした各行を順に処理します。
#!/bin/bash
LOG_FILE=”/var/log/syslog”
PATTERN=”authentication”
grep -i “$PATTERN” “$LOG_FILE” | while read -r line; do
echo “Processing line: $line”
# ここで追加の処理を行います
完了
次の例では、ps と grep コマンドを使った条件文で、サービスが実行中かどうかの状態を確認します。
#!/bin/bash
SERVICE=”CUPS”
if ! ps aux | grep -v grep | grep -q “$SERVICE”; then
echo ” $SERVICE is not running!”
else
echo “$SERVICE is running.”
fi
トラブルシューティングとよくある落とし穴
エンコーディングの問題を解決する
エンコーディングの不一致により、異なるエンコーディングの文字でパターンを検索しているときに grep コマンドが失敗することがあります。ロケール(LC_ALL=C)を設定するか、–encoding オプションを使用してエンコーディングの問題を修正できます。
特殊文字の扱いとエスケープ
正規表現では、リテラルな意味として使うためにエスケープが必要な特殊文字が使われます。これらの文字をエスケープするためにバックスラッシュ(\)を使用します。あるいは、パターンをリテラル文字列として扱うために -F(fixed string)オプションを使うこともできます。
複雑な正規表現パターンのデバッグ
複雑な正規表現は、意図したシナリオどおりに結果が返ってこない場合に、難しく感じることがあります。小さな部分に分解して一つずつテストし、その後で組み合わせることで、時間を節約できるだけでなく問題の特定にもつながります。
まとめ
grep コマンドについて、基本的な機能から、正規表現のような高度なテクニック、grep コマンドのさまざまなオプション、他のコマンドと grep をパイプでつなぐ方法、出力のリダイレクト、スクリプト作成やトラブルシューティングの手法まで、多くのことを扱いました。ほかの PowerShell テクニックと同様に、grep コマンドを実際に手を動かして試しながら学ぶことで理解が深まり、システム自動化を習得する上での隠れた可能性を引き出せるようになります。
共有する
もっと詳しく
著者について
Tyler Reese
プロダクト マネジメント担当副社長、CISSP
ソフトウェア セキュリティ業界で20年以上の経験を持つ Tyler Reese は、今日の企業が直面している急速に変化するアイデンティティおよびセキュリティ上の課題について深く理解しています。現在、彼は Netwrix Identity and Access Management ポートフォリオのプロダクト ディレクターを務めており、市場動向の評価、IAM 製品ラインの方向性の設定、そして最終的にはエンド ユーザーのニーズに応えることが主な責任です。彼の専門的な経験は、Fortune 500 企業向けの IAM コンサルティングから、大手のダイレクト・トゥ・コンシューマー企業のエンタープライズ アーキテクトとしての業務まで多岐にわたります。現在、彼は CISSP の認定資格を保有しています。