bash脚本 - 找到文件,其中包含文本

bash脚本 - 找到文件,其中包含文本

问题描述:

在bash我要为含有不区分大小写"document.cookie" | "setcookie"bash脚本 - 找到文件,其中包含文本

我怎么会做这种类型的.php|.html|.js的每个文件返回文件名(和文件路径)?

+4

你有没有考虑过只使用grep? http://www.cyberciti.biz/faq/grep-in-bash/ – Terrance 2011-05-27 13:52:11

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

如果你只是想文件名添加了L位(小写L):

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

第二个例子是完美的,我喜欢它的简短。 – Owen 2011-05-27 15:08:31

+0

这似乎并没有为我工作(至少不是在Mac上)....只是挂起... egrep -lir --include = *“回购” egrep:警告:stdin的递归搜索 – 2014-04-02 14:18:47

+10

你忘了添加搜索路径。路径是'。'在上面的例子中。在你的情况下,脚本正在等待输入在stdin上搜索。尝试:egrep -lir --include = *“repo”/(或任何其他路径) – LodeRunner 2014-05-06 16:47:13

听起来像是一个完美的工作为grep或许ack

或者这个奇妙的建筑:

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

+1使用'-exec grep ...'比我的'xargs'方法更好,因为它不会阻塞文件名中的空格。 – 2011-05-27 14:09:56

试着这么做grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

的-i使得情况insensitlve

的“”最后意味着你想从你当前的目录开始,这可以用任何目录代替。

的“-r”手段做到这一点递归,一直目录树

了“-n”打印匹配项的行号。

“--include”允许您添加文件名,扩展名。通配符接受

欲了解更多信息,请参阅:http://www.gnu.org/software/grep/

+4

或者使用'-l'选项(只是打印匹配的文件名)而不是'-n' – 2011-05-27 14:03:48

+0

@glenn jackman好点 – Raoul 2011-05-27 14:07:54

find他们grep的字符串:

这将在/启动/路径和grep的正则表达式'(document\.cookie|setcookie)'你3种类型的所有文件。拆分为两行用反斜杠只是可读性...

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

就像普遍使用find一样,但是在我的脑海里最好使用'-exec grep -l' '#} \;' – NGix 2012-11-26 18:28:32

+0

谢谢@Michael Berkowski这种方式在〜500Gb的weigth目录下最快超过5或8次'#egrep -ir --include = file.foo“(foo | bar)”/ dir'。 – Qh0stM4N 2018-01-24 13:55:24

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

只是为了还包括一个替代方案,你也可以使用这个:

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

其中:

  • -regextype posix-extended告诉find什么样的正则表达式的期望
  • -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/替换正则表达式(^.*):.*$(意味着 [由()封闭东西]包括一切 [.* =一个或多个任意的字符的来自该行的开头 [^]直到“第一‘:’随后任何直到”线 [的端3210])被替换的正则表达式的第一个 [\1]。
  • u通知排序删除重复条目(以sort -u为可选项)。

...远离最优雅的方式。正如我所说的,我的意图是增加可能性的范围(并且对你可以使用的一些工具给出更完整的解释)。