我想搜索包含patterns
和directory
的{{1}}中的多个recursive directories
。
我知道files
的命令如下
grep
或
grep -e '(pattern1)|(pattern2)'
使用grep -r -E 'string1|string2|string3' /var/www/http
或ack
?
答案 0 :(得分:12)
这应该足够了:
ack -R 'string1|string2'
由于-R
是默认值,您可以省略它:
ack 'string1|string2'
来自man ack
:
-r , -R , - 存款
递归到子目录。这是默认设置,仅供参考 与grep的兼容性。你也可以用它来转动 - 没有递归 关闭。
如果你想从文件中获取模式,比如/path/to/patterns.file,你可以使用:
ack "$(cat /path/to/patterns.file)"
或同等地:
ack "$(< /path/to/patterns.file)"
我找不到与grep -f
完全等效的内容。
答案 1 :(得分:1)
对于ag
,从版本0.19.2开始,默认是递归搜索目录和文件。
要搜索多个模式,您可以使用类似的语法ack
ag 'pattern1|pattern2'
将搜索pattern1
和pattern2
。
如果您不想递归搜索,可以通过开关--depth NUM
因此,
ag 'pattern1|pattern2' --depth 1
只会在当前目录中搜索这两种模式。
答案 2 :(得分:0)
我不知道为什么,但是对于我的用例,管道解决方案不起作用。
我只是使用ack -l
的输出作为grep的输入。例如,要快速查找包含string 1
和string 2
的所有Javascript文件:
grep "string 2" `ack -l --js "string 1"`
答案 3 :(得分:0)
ack命令还可以与管道一起字符串化。 例如,第一个ack查找包含 pattern1 的文件,然后将其通过管道传输到另一个ack以仅搜索这些文件中的 pattern2
ack -l 'pattern1' | ack -x 'pattern2'
-l </ strong>参数意味着只列出匹配的文件(而不是匹配的文本)。 -x 参数表示仅搜索通过管道传输到该文件的文件。这类似于缩小文件范围以进行下一个ack搜索。
ack -l 'pattern1' | ack -xl 'pattern2' | ack -x 'pattern3'
这是 AND 运算符,而不是其他解决方案中给出的OR运算符。