gpt4 book ai didi

regex - 递归列出包含 m of n 正则表达式的文件

转载 作者:行者123 更新时间:2023-12-02 16:37:01 25 4
gpt4 key购买 nike

我有一个包含很多文件的目录。我有 n 搜索模式,并想列出与其中 m 匹配的所有文件。

示例:从下面的文件中,列出至少包含 两个 str1str2str3str4

$ ls -l dir/
total 16
-rw-r--r--. 1 me me 10 Jun 22 14:22 a
-rw-r--r--. 1 me me 5 Jun 22 14:22 b
-rw-r--r--. 1 me me 10 Jun 22 14:22 c
-rw-r--r--. 1 me me 9 Jun 22 14:22 d
-rw-r--r--. 1 me me 10 Jun 22 14:22 e
$ cat dir/a
str1
str2
$ cat dir/b
str2
$ cat dir/c
str2
str3
$ cat dir/d
str
str4
$ cat dir/e
str2
str4

我设法通过在 find 结果上生成 n grep 进程的相当丑陋的 for 循环实现了这一点对于每个文件,这显然是非常低效的,并且在包含大量文件的目录上会花费很长时间:

for f in $(find dir/ -type f); do
c=0
grep -qs 'str1' $f && let c++
grep -qs 'str2' $f && let c++
grep -qs 'str3' $f && let c++
grep -qs 'str4' $f && let c++
[[ $c -ge 2 ]] && echo $f
done

我很确定我可以以一种性能更好的方式实现这一目标,但我不确定如何解决它。据我从手册页(即 -e-m)中了解到,单独使用 grep 是不可能的。

什么是正确的工具?这可以用 awk 实现吗?

好处:通过使用 find 我可以定义要更精确搜索的文件(即 -prune 某些子目录或仅使用 -iname '* 搜索文件.txt'),我也想用其他解决方案来做。


更新

下面是关于不同实现的性能的一些统计数据。


查找 + awk

(脚本来自 this 答案)

real    0m0,006s
user 0m0,002s
sys 0m0,004s

python

(本人python菜鸟,请指教是否可以优化):

import os

patterns = []
patterns = ["str1", "str2", "str3", "str4"]

for root, dirs, files in os.walk("dir"):
for file in files:
c = int(0)
filepath = os.path.join(root, file)
with open(filepath, 'r') as input:
for pattern in patterns:
for line in input:
if pattern in line:
c += 1
break
if ( c >= 2 ):
print(filepath)
real    0m0,025s
user 0m0,019s
sys 0m0,006s

c++

(脚本来自 this 答案)

real    0m0,002s
user 0m0,001s
sys 0m0,001s

最佳答案

$ cat reg.txt
str1
str2
str3
str4
$ cat prog.awk
# reads regexps from the first input file
# parameterized by `m'
# requires gawk or mawk for `nextfile'
FNR == NR {
reg[NR] = $0
next
}
FNR == 1 {
for (i in reg)
tst[i]
cnt = 0
}
{
for (i in tst) {
if ($0 ~ reg[i]) {
if (++cnt == m) {
print FILENAME
nextfile
}
delete tst[i]
}
}
}
$ find dir -type f -exec awk -v m=2 -f prog.awk reg.txt {} +
dir/a
dir/c

关于regex - 递归列出包含 m of n 正则表达式的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62515497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com