特定のテキストを含むファイルを検索する


153

bashでは.php|.html|.js、大文字と小文字を区別しない文字列を含むタイプのすべてのファイルのファイル名(およびファイルへのパス)を返したい"document.cookie" | "setcookie"

どうすればいいですか?


4
あなたは単にgrepを使うことを考えましたか?cyberciti.biz/faq/grep-in-bash
Terrance、

このタイトルはかなり誤解を招くものです。「ファイルを含む、与えられたテキストを見つける」
Josh C

回答:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

rフラグが(サブディレクトリを検索)を再帰的に検索することを意味します。iフラグは、ケース非感受性を意味します。

ファイル名だけが必要な場合は、l(小文字のL)フラグを追加します。

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

それは私にはうまくいかなかったようです(少なくともMacでは)....ハングアップします... egrep -lir --include = * "repo" egrep:警告:stdinの再帰検索
Dean Hiller

13
検索するパスを追加するのを忘れました。パスは '。'です。上記の例では。あなたの場合、スクリプトは入力が標準入力を検索するのを待っています。試してみてください:egrep -lir --include = * "repo" /(またはその他のパス)
LodeRunner 2014年

1
grep -E ... >egrep ...
アマン

grep: (error|fail): No such file or directoryUbuntu Desktop 16でエラーが発生しました。ヒントはありますか?
Nam G VU

これを機能させるには、*を\でスキップする必要がありました。だから私は--include=\*.{php,html,js}
Mehrad Mahmoudian 2018

53

のようなものを試してください grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-iその場合のinsensitlveを作ります

.あなたは、現在のディレクトリから開始したいエンド手段で、これは任意のディレクトリで置換することができます。

-r手段は、右のディレクトリツリーの下、再帰的にこれを行います

-n、一致する行番号を出力します。

これ--includeにより、ファイル名、拡張子を追加できます。ワイルドカードを受け入れ

詳細については、http://www.gnu.org/software/grep/を参照してください。


4
または、-l代わりにオプションを使用します(一致するファイル名を出力するだけ)-n
glenn jackman '27

15

findそれらとgrep文字列:

これにより、3つのタイプのすべてのファイルが/ starting / pathおよび正規表現のgrepに見つかります'(document\.cookie|setcookie)'。読みやすくするために、バックスラッシュで2行に分割します...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
findの一般的な使用法と同様ですが、使用する方が良いと思います-exec grep -l 'sth' {} \;
NGix

おかげで@Michael Berkowskiこの方法は、# egrep -ir --include=file.foo "(foo|bar)" /dir500Gbのweigthディレクトリで5または8倍以上の速さで高速になります。
Qh0stM4N 2018年

9

完璧な仕事のように聞こえるためgrepか、おそらくACK

またはこの素晴らしい構造:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1の使用-exec grep...xargs、ファイル名のスペースを詰まらせないため、私の方法よりも優れています。
Michael Berkowski、

@MichaelBerkowski:次のように使用して、ファイル名の空白を処理できますfind . -type f -print0 | xargs -0 -I {} grep "search_string" {}。もちろん、他のオプションも追加できます。
Pascal

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

もう1つの代替を含めるために、これを使用することもできます。

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

どこ:

  • -regextype posix-extendedfindどんな正規表現を期待するかを伝えます
  • -regex "^.*\.(php|html|js)$"find正規表現自体にファイル名が一致する必要があることを伝えます
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;伝えfind間で指定された(そのオプションと引数を指定して)コマンドを実行する-execオプションと\;、見つかった各ファイルの、{}ファイル・パスは、このコマンドでどこに行くかを表します。

    ながら

    • Eオプションはgrep、(括弧をサポートするために)拡張正規表現を使用するように指示し、...
    • Hオプションはgrep、一致する前にファイルパスを出力するように指示します。

そして、これを前提として、ファイルパスのみが必要な場合は、以下を使用できます。

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

どこ

  • |[パイプ]の出力をfindこの後の次のコマンドに送信します(つまりsed、次にsort
  • rオプションはsed、拡張正規表現を使用するように指示します。
  • s/HI/BYE/sed「HI」のすべての最初の出現(行ごと)を「BYE」に置き換えるように指示します...
  • s/(^.*):.*$/\1/正規表現を置き換えるために、それを伝える(^.*):.*$意味(グループ [で囲まれたもの()を含む] すべて [ .*からのより多くの任意の文字の= 1または] 行の先頭に [ ^]までの「最初の『:』に続くものまで」の終わり行 [ $])最初のグループ [\1置換された正規表現の ]によって。
  • u重複するエントリを削除するようにsortに指示します(sort -uオプションとして取得)。

...最もエレガントな方法から遠い。私が言ったように、私の意図は可能性の範囲を広げることです(そしてあなたが使うことができるいくつかのツールについてより完全な説明を与えることも)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.