如何查看 grep 中多个目录中多个模式匹配的行

如何查看 grep 中多个目录中多个模式匹配的行

感谢您所有的投入和努力,我已经能够找到解决我的“问题”的方法。

查找 . -type f -name '*.csv' -print0 | xargs -r0 grep -rn 字符串1 | grep 字符串2 | grep 字符串3

将 find 的输出传递给多个 grep 即可。

答案1

按以下方式使用 egrep:

无论出现在不同的线路上

egrep -rn "244959560909|327149205|2022-03-18" *

或者

事情表现在同一条线上

egrep -rn "244959560909.*327149205.*2022-03-18" *

您遇到的问题是,您对前面的命令传递的内容使用了多个过滤器,您没有将整个列表提供给管道中的以下命令,但是 egrep 允许您在查询中使用更复杂的正则表达式。

高血压

PS,在与 @mashuptwice 进行简短交谈后,似乎您正在寻找类似这样的内容:

for i in `egrep "244959560909|327149205|2022-03-18" -rl *`
do 
egrep -l "244959560909" $i && egrep -l "327149205" $i && egrep -l "2022-03-18" $i && echo $i
done|sort -u > matchingfiles.lst
egrep -rn "244959560909|327149205|2022-03-18" $(<matchingfiles.lst)

代码的这一添加将强制三个字符串出现在文件内部,然后显示匹配的行,我不会删除原始解决方案,因为我有点困惑。

高血压

PPS,因为要寻找的是同一行中的三个字符串,所以原始答案必须更改为以下内容:

egrep -rn "244959560909.*327149205.*2022-03-18" *

高血压

答案2

这里无需使用xargs

-$ grep -rn other * | grep  alias | grep file                                                                                                                                                                 1 ↵
README.md:3:Should make aliases and other user specific config files way more conveniant.

只需将一个管道连接grep到下一个管道即可。使用第一个管道指定任何标志就足够了grep

man grep

-n, --line-number
      Prefix each line of output with the 1-based line number within its input file.

-l, --files-with-matches
      Suppress normal output; instead print the name of each input file from which output would normally have been printed.  Scanning each input file stops upon first match.

保留火柴的颜色

为了在传输到下一个 grep 实例时保留匹配的颜色,您可以使用参数color=always

为了方便起见,您可以设置如下所示的别名:

alias grep='grep color=always'

请注意,例如在管道传输时,颜色选项可能会与文本混淆xargs

例子:

grep 突出显示的示例

请注意,许多发行版已经为 grep 设置了别名,您可能需要修改现有的别名。

相关内容