用ack搜索多个模式(单词)?

时间:2014-10-09 10:02:04

标签: linux grep ack ag

我想搜索包含patternsdirectory的{​​{1}}中的多个recursive directories

我知道files的命令如下

grep

grep -e '(pattern1)|(pattern2)'

使用grep -r -E 'string1|string2|string3' /var/www/http ack

的命令是什么?

4 个答案:

答案 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'

将搜索pattern1pattern2

如果您不想递归搜索,可以通过开关--depth NUM

将搜索深度设置为1

因此,

ag 'pattern1|pattern2' --depth 1

只会在当前目录中搜索这两种模式。

答案 2 :(得分:0)

我不知道为什么,但是对于我的用例,管道解决方案不起作用。

我只是使用ack -l的输出作为grep的输入。例如,要快速查找包含string 1string 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运算符。