多くのファイル(各ファイルサイズが1 GB以上)を含むディレクトリから、指定された数値/文字列セットをどのように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のファイルに保存します(上記のコードのSERVICE2を参照)。その後、番号/レポートが見つかったら印刷します。その場合は、番号が見つかったファイルを印刷します。
答え1
使用grep
:
grep -f /dir1/dir2/file.csv /dir1/dir2/*
これにより、.csv
ファイルからパターンが抽出され、ファイル内のパターンが検索されます/dir1/dir2
。 .csvを検索しているディレクトリに入れないことをお勧めします。それ以外の場合は一致します。 grepで再帰的に検索するには、dir2
このフラグを追加してください。-r
答え2
ディレクトリ内のすべてのファイルにわたってパターンを把握したい場合。 grepコマンド自体を使用してこれを実行できます。
例:
grep -Hnr "pattern" folderPath
これがあなたが望むものであるかどうか教えてください。