Linuxでファイル中の文字列を安全に探す基本形はgrep -nF -- '探す文字列' sample.txtです。-Fは入力を正規表現ではなく固定文字列として扱い、-nは行番号を付け、--は後続をオプションとして解釈しないようにします。正規表現が必要なときだけ-Eを選びます。再帰検索は対象ディレクトリとファイル種類を限定し、権限エラー、バイナリ、文字コード、機密情報を含む出力を確認します。「一致なし」の終了状態1と実行エラー2を同じ成功扱いにしないことが、自動化では特に重要です。
最初は固定文字列-Fで検索する
grep -nF -- 'apple' sample.txtはappleを含む行と行番号を表示します。固定文字列なら.、*、角括弧などを正規表現記号として扱わないため、ログのURL、設定キー、エラーメッセージをそのまま探せます。検索語を単一引用符で囲むと、空白、ドル記号、アスタリスクをシェル展開から保護できます。
検索語に単一引用符自体を含む場合や変数を使う場合は、シェルの引用規則を確認します。変数ならgrep -nF -- "$needle" fileと二重引用し、空白を一つの引数にします。秘密値をコマンドラインへ直接書くと履歴やプロセス情報へ残り得るため、秘密そのものではなく固定ラベルやキー名を探し、結果の閲覧範囲を制限します。
–でハイフン始まりを安全に扱う
-DDEBUGを探す例はgrep -nF -- '-DDEBUG' build.logです。--以降はオプションではないため、検索語を誤ってgrepのフラグにしません。ファイル名が-notes.txtのようにハイフンで始まる場合は、./-notes.txtとパスを明示する方法もあります。
利用者入力をそのままオプション位置へ連結しません。シェルスクリプトでは検索語とファイル配列を別引数として渡し、evalを使わないようにします。検索語が空文字ならすべての行へ一致するため、意図しない大量出力を防ぐには実行前に空でないことを検査します。
大文字小文字・単語・行全体を選ぶ
-iは大文字小文字を区別せず、-wは単語全体、-xは行全体が一致する行を選びます。例えばgrep -niFw -- 'error' app.logはerrorという単語を大小無視で探します。ただし「単語」の境界は文字、数字、アンダースコア等の規則で決まり、ハイフン区切りや日本語で期待と異なる場合があります。
設定ファイルの完全な値を探すなら-xF、部分文字列なら-Fだけ、と目的で選びます。-iの照合はロケールやUnicodeの影響を受け得ます。ASCIIログへLC_ALL=Cを使うと速度が上がる場合がありますが、国際化テキストの文字分類が変わるため、性能目的で無条件固定しません。
正規表現は-Eを明示してテストする
複数パターンや行構造が必要ならgrep -nE -- '(ERROR|WARN):[[:space:]]+[0-9]+' app.logのように拡張正規表現を使います。GNU grepの既定-Gは基本正規表現、-Eは拡張正規表現、-PはPerl互換です。構文を混在させず、検索語がデータなら正規表現へ入れず-Fに戻します。
-Pは環境のPCRE2版やUnicode動作に差があり、他システムへ移すスクリプトでは利用可能性を確認します。大きなファイルで複雑な式や-zPを使うと、メモリと時間が増える場合があります。少量の代表データに一致すべき行、一致してはいけない行、空行、長い行を用意し、実ファイル前に検証します。
複数パターンは-eまたは-fで管理する
grep -nF -e 'timeout' -e 'connection refused' app.logはどちらかを含む行を探します。固定文字列でも-eを複数使えます。パターンが多い場合は一行一パターンのアクセス制限されたファイルを作り、grep -nF -f patterns.txt app.logとします。空行があると空パターンになり全行へ一致し得るため検査します。
パターンファイルはレビュー、版管理、文字コード、改行形式、所有者を確認します。外部から受け取った正規表現を無検証で実行せず、固定文字列要件なら必ず-Fを指定します。機密値一覧をパターンファイルにする場合は内容自体が秘密なので、権限、ログ、バックアップ、削除期限を秘密管理の基準へ合わせます。
複数ファイルと再帰検索を限定する
現在ディレクトリのテキストだけならgrep -nF -- 'apple' ./*.txtです。サブディレクトリも含めるならgrep -rnF --include='*.conf' --exclude-dir='.git' -- 'ListenAddress' ./configのように開始点と対象種類を絞ります。-rは再帰、-Rは遭遇した全シンボリックリンクをたどるため、通常は-rを選びます。
シェルの*.txtは隠しファイルへ通常一致せず、引数数の上限にも達し得ます。大規模ツリーではgrepの再帰機能またはfindのNUL安全な連携を使います。依存物、キャッシュ、バックアップ、仮想環境を除外しないと、重複結果や秘密コピーが増えます。対象外を明示し、除外による見落としも記録します。
表示量を目的に合わせる
-Hはファイル名、-nは行番号、-cはファイルごとの一致行数、-lは一致するファイル名だけ、-Lは一致しないファイル名だけを出します。-oは一致部分だけを出し、-A/-B/-Cは後/前/前後の文脈行を表示します。調査の初手は-lや-cで範囲を把握し、必要ファイルだけ詳細表示します。
一致行の前後には個人情報や秘密が含まれる可能性があります。文脈行数を大きくせず、出力先を権限制御します。--color=alwaysをファイルへ保存すると制御コードが混ざるため、自動処理では色なしにします。行番号は検索時点のファイルに対する位置で、後から内容が変われば再現しないため、時刻とファイルハッシュも必要に応じて記録します。
バイナリと文字コードを区別する
grepはバイナリと判断したファイルで通常の行出力を抑えることがあります。テキストだけを再帰検索するなら-Iでバイナリを無視せず、「無視する」という選択を明示できます。-aはバイナリをテキストとして扱いますが、端末へ制御文字を出したり巨大な一行を処理したりするため、正体不明ファイルへ安易に使いません。
圧縮ログ、PDF、実行ファイルは通常のgrepだけで正しく検索できません。形式に合う読み取りツールで安全な作業コピーを展開/抽出し、そのテキストを検索します。異なる文字コードを混在させると一致漏れが出るため、file等の結果と作成元仕様を確認し、元データを上書きせず変換コピーで検証します。
一致しない行-vをフィルター削除と誤解しない
grep -vF -- 'DEBUG' app.logはDEBUGを含まない行を標準出力へ表示します。元ファイルを編集するコマンドではありません。> app.logを同じ入力へ向けると、シェルがgrep開始前にファイルを空にするため絶対に行いません。必要なら別の出力ファイルを作り、件数、先頭/末尾、ハッシュを確認してから承認された置換手順へ進みます。
ログの「不要行」には障害解析や監査に必要な情報が含まれる場合があります。元ログを保持し、フィルター条件、実行時刻、ツール版を記録します。-vと広い正規表現の組み合わせは意図せず大半を除外するため、まず一致側を表示し、除外される件数とサンプルを確認します。
終了状態0・1・2を自動化で分ける
GNU grepの終了状態は、一致があれば0、一致がなければ1、エラーなら通常2です。一致なしは検索として正常でも、シェルのset -e下ではスクリプト終了を招くことがあります。一方、|| trueで一律無視すると、権限不足やファイル不存在も隠します。終了値を変数へ保存し、0、1、それ以外を明示的に分岐します。
-qは最初の一致で静かに終了するため存在確認に便利ですが、一致を見つけた後の一部エラーを結果へ反映しない場合があります。全ファイルが読めたことを保証したい監査では-qだけに依存しません。標準エラーを保存し、対象ファイル件数、grep終了値、権限エラーを確認します。
ファイル名を後続処理へ渡すなら-Zを使う
grep -rlZF -- 'needle' ./docsは一致ファイル名をNULで区切ります。GNUツールのxargs -0等と組み合わせれば、空白、改行、引用符を含む名前を壊しません。ただし検索結果をそのまま削除や書換えへ渡さず、まずNUL対応の読み取りコマンドでstatやハッシュを確認します。
人向けレポートへ変換する際も、改行入り名前が一件を複数行に見せる点を明示します。自動処理ではファイル配列またはNUL区切りを最後まで保ちます。ファイル名をシェルコードとして再評価するevalや、改行区切りのfor f in $(grep ...)を使いません。
調査記録を残し機密出力を最小化する
検索コマンド、作業ディレクトリ、対象範囲、除外、grep版、ロケール、開始/終了時刻、終了状態を記録します。ログがローテーションや追記で変わる場合は読み取り専用コピーまたはスナップショットで再現性を確保します。障害調査のため本番全体を無制限に再帰検索せず、サービス、時刻、ホスト、ファイル種類から範囲を狭めます。
grep結果にはパス、ユーザー名、トークン、メール、内部URLが混ざり得ます。端末画面、シェル履歴、CIログ、チケットへ残す情報を最小化し、共有前に承認された方法でマスキングします。マッチしなかったことは文字コード、対象漏れ、権限、圧縮、ローテーションの可能性を残すため、「存在しない」と断定せず検索条件と到達範囲を報告します。
確認チェックリスト
- 固定文字列は-F、正規表現は必要時だけ-Eにした
- 検索語と変数を引用し–でオプションを終えた
- 開始ディレクトリ、include、excludeを限定した
- -rと全リンクをたどる-Rを区別した
- バイナリ/圧縮/文字コードを別処理にした
- 同じ入力ファイルへリダイレクトしていない
- 終了状態0/1/2と標準エラーを区別した
- 後続処理は-Z/NUL区切りで機密出力を管理した

コメント