感谢您所有的投入和努力,我已经能够找到解决我的“问题”的方法。
查找 . -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 设置了别名,您可能需要修改现有的别名。