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

San*_*gle 8 linux grep ack ag

我想patterns在一个directory包含recursive directories和中搜索多个files.

我知道命令grep如下

grep -e '(pattern1)|(pattern2)'
Run Code Online (Sandbox Code Playgroud)

要么

grep -r -E  'string1|string2|string3' /var/www/http
Run Code Online (Sandbox Code Playgroud)

使用ackor 的命令是什么ag

fed*_*qui 14

这应该足够了:

ack -R 'string1|string2'
Run Code Online (Sandbox Code Playgroud)

由于-R是默认的,你可以省略:

ack 'string1|string2'
Run Code Online (Sandbox Code Playgroud)

来自man ack:

-r,-R, - recurse

递归到子目录.这是默认设置,只是为了与grep兼容.你也可以用它来转动 - 没有递减.


如果你想从文件中获取模式,比如/path/to/patterns.file,你可以使用:

ack "$(cat /path/to/patterns.file)"
Run Code Online (Sandbox Code Playgroud)

或者相当于:

ack "$(< /path/to/patterns.file)"
Run Code Online (Sandbox Code Playgroud)

我找不到与之完全相同的东西grep -f.


小智 7

ack 命令还可以与管道一起串连。例如,第一个 ack 找到包含pattern1的文件,然后将其通过管道传输到另一个ack以仅在这些文件中搜索pattern2

ack -l 'pattern1' | ack -x 'pattern2'
Run Code Online (Sandbox Code Playgroud)

-l参数表示仅列出匹配的文件(而不是匹配的文本)。-x参数意味着仅搜索通过管道传递给它的文件。这类似于缩小下一次 ack 搜索的文件范围。

ack -l 'pattern1' | ack -xl 'pattern2' | ack -x 'pattern3'
Run Code Online (Sandbox Code Playgroud)

这是AND运算符,而不是其他解决方案中给出的 OR 运算符。