많은 파일(각 파일 크기가 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의 파일에 저장합니다(위 코드의 SERVICE2 참조). 그런 다음 번호/보고서가 발견되면 인쇄하십시오. 그렇다면 번호가 발견된 파일을 인쇄합니다.
답변1
사용 grep
:
grep -f /dir1/dir2/file.csv /dir1/dir2/*
이렇게 하면 .csv
파일에서 패턴을 추출하고 에 있는 파일에서 패턴을 검색합니다 /dir1/dir2
. .csv를 검색 중인 디렉터리에 넣지 않는 것이 좋습니다. 그렇지 않으면 일치하게 됩니다. grep에서 재귀적으로 검색하려면 dir2
이 플래그를 추가하세요.-r
답변2
디렉터리의 모든 파일에 걸쳐 패턴을 파악하려는 경우. grep 명령 자체를 사용하여 이 작업을 수행할 수 있습니다.
예:
grep -Hnr "pattern" folderPath
이것이 당신이 원하는 것인지 알려주세요.