bash脚本 - 找到文件,其中包含文本
在bash我要为含有不区分大小写"document.cookie" | "setcookie"
bash脚本 - 找到文件,其中包含文本
我怎么会做这种类型的.php|.html|.js
的每个文件返回文件名(和文件路径)?
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
如果你只是想文件名添加了L位(小写L):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
第二个例子是完美的,我喜欢它的简短。 – Owen 2011-05-27 15:08:31
这似乎并没有为我工作(至少不是在Mac上)....只是挂起... egrep -lir --include = *“回购” egrep:警告:stdin的递归搜索 – 2014-04-02 14:18:47
你忘了添加搜索路径。路径是'。'在上面的例子中。在你的情况下,脚本正在等待输入在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 {} \;
+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/
或者使用'-l'选项(只是打印匹配的文件名)而不是'-n' – 2011-05-27 14:03:48
@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)'
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
为可选项)。
...远离最优雅的方式。正如我所说的,我的意图是增加可能性的范围(并且对你可以使用的一些工具给出更完整的解释)。
你有没有考虑过只使用grep? http://www.cyberciti.biz/faq/grep-in-bash/ – Terrance 2011-05-27 13:52:11