デフォルトでは、ほとんどの検索ツールは、ファイルの内容ではなく、ファイル名を調べます。しかし、最も有名な GNU 検索プログラムである grep
は、正しいフラグを付ければファイルの中身を見ることができます。ここでは、Linuxでファイル中の特定の単語を見つける方法を紹介します。
grep を使ってファイル中の特定の単語を探す
デフォルトでは、grepはファイル名だけでなくファイルの内容も検索します。これは大部分のLinuxシステムに含まれており、一般的にディストロ間で同一です。プログラマが自分のプロジェクトのファイルの中身を見るには、ack
のような別のコマンドを実行したほうがいいかもしれません。
ファイルがどのようにエンコードされているかによって、 grep
は常に内部を見ることができるわけではありません。しかし、ほとんどのテキストベースのフォーマットでは、 grep
はファイルのテキストをスキャンして、指定されたパターンを見つけることができます。
grep -rw '/path/to/search/' -e 'pattern'.
- r` フラグは grep を再帰的なモードに設定し、指定されたディレクトリに含まれるすべてのディレクトリをナビゲートします。
- w` フラグは単語全体にマッチするものを探します。これは、“red “が、"redundant” や “tired” のような、redを含む文字列ではなく、実際の単語 “red” にのみマッチすることを意味します。これは、“red “の周りを、単語以外の文字(文字、数字、アンダースコア以外)で囲んだものだけを探します。
- e` フラグは、検索するパターンの前に付けます。デフォルトで正規表現をサポートしています。
grep の速度を上げるために、 --exclude
と --include
フラグを使用すると、検索対象を特定の種類のファイルに限定することができます。例えば、 --exclude='*.csv'
は拡張子が .csv のファイル内を検索しません。一方、--include='*.txt'
は、拡張子が.txtのファイルのみを検索対象とします。このフラグは、以下のように grep コマンドの直後に追加することができます。
grep --exclude='\*.csv' -Rw '/path/to/search' -e 'pattern'.
また、以下のような書式で指定したディレクトリを除外することも可能です。
grep --exclude-dir='{dir1,dir2,\*_old}' -Rw '/path/to/search' -e 'pattern'.
このコマンドは、現在の作業ディレクトリにあるdir1, dir2 という名前のディレクトリや、 *
というパターンにマッチするディレクトリを検索対象からはずし、検索を行わないようにするものである。指定された再帰的完全一致検索を、現在の作業ディレクトリ内の他のすべてのファイルに対して実行します。grepで使用できる面白いフラグ
grep とその動作について正しく理解できたところで、コマンドに付加できる便利なフラグをいくつか紹介します。
- i` - grep が大文字小文字を区別しない検索を行うようにします。例えば、“Kraken “を検索すると、“kraken “または “kRaken “にマッチした結果が返されます。
-n
- マッチの横に行番号を表示します。これはプログラマや大きな設定ファイルを見ている人に特に便利です。- R
-
-r` と同様に、grep はすべてのサブフォルダを再帰的に検索しますが、このフラグはシンボリックリンク(ショートカット)を追跡します。 - s`- エラーメッセージを表示しないようにします。存在しないファイル、読み込めないファイル、不適切なパーミッションのファイルなど、目障りなエラーがたくさん出る場合は、これを渡すと、grepが見つけたマッチを表示することに専念できるようになります。
find を使ってファイルの中の特定の単語を探す
find` コマンドの構文は grep よりも複雑ですが、そちらを好む人もいます。
find . -name "\*.php" -exec grep "pattern" {} ;
このコマンドはfindの-exec
フラグを使用して、見つかったファイルをgrepに渡して検索します。シンタックスをうまく使えば、 find
の高速なファイルシステム検索を使って、検索したい特定のファイルタイプを見つけ、それを grep
にパイプし、ファイル内を検索させることができるのです。
findはファイル名だけを見て、中身は見ないことに注意してください。そのため、ファイルのテキストと内容を検索するためには、grepが必要です。通常の grep フラグは
-exec` フラグの中で完全に動作するはずです。
ack を使ってファイルの中の特定の単語を検索する
ackコマンドはおそらく最も高速な検索ツールですが、 grep
ほどは人気がありません。以下のコマンドはカレントディレクトリ内を検索します。
ack 'パターン'
特定のファイルやディレクトリを検索したい場合は、そのファイルや完全修飾パス名を検索に追加することができます。
ack 'パターン' /path/to/file.txt
GUIが欲しい?キャットフィッシュを使おう
もしあなたがターミナルにアレルギーがあるのなら、すべての人気のあるLinuxディストロはCatfishという、特定の文字列のためにファイルやその内容を検索することができる多機能なGUIアプリケーションを提供しています。ここで説明したコマンドほど高度なものではありませんが、グラフィカルなインターフェースを好む人々にとって貴重なサービスを提供してくれます。
ファイルの内容を特定の単語で検索するには、Catfishの右上にあるメニューをクリックし、“Search file contents “をクリックする。
設定したら、上のバーに検索したいものを入力して、Enter
を押します。これで完了です!
Frequently Asked Questions (よくある質問)
どうすれば grep 検索を途中で止めることができますか?
ターミナルで進行中のプロセスを停止させるには、キーボードで Ctrl
+ C
を押すだけです。これは実行中のプロセスを終了させるためのシグナルを送ります。ターミナルエミュレータの中で通常のコピー&ペーストのショートカットを使えないのもこのためです。
ファイルの中身を検索するファイルマネージャはありますか?
KDE Plasma デスクトップ環境を使用している場合、デフォルトのファイルマネージャ (Dolphin) にはすでにこの機能が備わっています。検索ボタンをクリックしてファイルを探すとき、検索バーの下にファイル名とファイルの内容を選択するオプションがあります。
ファイル内の単語を検索したい場合は、「Content」をクリックするだけです。grepを使うほど高度なことはできませんが、これで十分です。grep の他の使い方はありますか?
grep はファイルシステムを検索するためだけではありません! 興味深いことに、手動で何かを探す代わりに、ほとんどすべてのコマンドにパイプを通し、その出力を検索することができます。
Grepは、コマンドの出力をフィルタリングして、よりあなたに関連するものを表示するために使用することができます。十分な実験をすれば、最終的にはあなたのコンピュータを診断し、理解する技術を習得することができるでしょう すべてのスクリーンショットはMiguel Leiva-Gomezによるものです。