如何在包含许多文件(每个文件大小超过 1GB)的目录中 grep 一组给定的数字/字符串。而且我也希望它能快点。下面是我的脚本,但速度很慢:
#!/bin/sh
echo "Report Key|Status|FileName"
SERVICE1="/dir1/dir2/file.csv"
FINDCMD1='"sting1":"'
FINDCMD2='"'
for i in $(cat $SERVICE1);
do
#echo "$i"
FINALFINDCMD=$FINDCMD1$i$FINDCMD2
ORACLEFINALFIND=$ORACLEFINDCMD$i$FINDCMD2
SERVICE2=$(cd /dir1/dir2 && find . -type f -print0 | xargs -n1000 -r0P3 grep $FINALFINDCMD| grep "string2")
if [[ $SERVICE2 = *"string2"* ]]; then
SERVICE3=$(echo $SERVICE2 | cut -c73-115)
echo "$i|report found|$SERVICE3"
fi
else
echo "$i|report not found"
fi
let i++
done
假设:file.csv 有以下数字:
123456
234567
345678
该脚本单独接收这些报告,并在 dir2 中的文件中对它们进行 grep(请参阅上面代码中的 SERVICE2)。然后打印是否找到数字/报告。如果是,它会打印在哪个文件中找到该号码。
答案1
使用grep
:
grep -f /dir1/dir2/file.csv /dir1/dir2/*
这将从您的.csv
文件中提取模式并在位于 的文件中搜索它们/dir1/dir2
。我建议不要将您的 .csv 放在您要搜索的同一目录中,否则它将是匹配的。如果您想在grep中递归搜索,dir2
请添加该标志。-r
答案2
如果你想在一个目录的所有文件中 grep 一个模式。您可以使用 grep 命令本身来完成此操作。
例子:
grep -Hnr "pattern" folderPath
让我知道这是否是您想要的。