grep을 사용하여 파일 목록을 검색하는 간단한 스크립트를 작성하고 싶습니다. 현재 코드는 다음과 유사합니다.
a= file1.txt
b= file2.txt
for
do
grep '$a.*$b' /root/listoffiles/*php >> found.txt
완벽한
file1
둘 file2
다 단어 목록입니다. 따라서 여러 기준을 사용하여 목적지를 검색합니다. 예를 들어 $a
"hello"와 "world"가 될 수도 있고 $b
, 두 번째 줄이 "red"와 "tshirt"가 될 수도 있습니다. 두 가지 기준이 일치하는 항목을 찾으면 파일에 저장합니다. 내가 사용하고 있는 루프가 작동하지 않으며 충분히 효율적이지 않습니다. 나는 단지 기준에 맞는 결과를 원할 뿐입니다. 어떤 제안이 있으십니까?
답변1
당신이 먼저해야특수문자 탈출두 파일 모두에(있는 경우) 그런 다음 이를 통해 결합합니다. 예를 들어 '를 paste
통해 사용할 수 있는 패턴 목록이 생성됩니다 . 파일이 너무 많지 않는 한 여러 인수 로 루프가 필요하지 않습니다. 받아들여질 수 있습니다:grep
-f
grep
paste -d'.*' <(sed 's/[.[\*^$]/\\&/g' file1.txt) /dev/null \
<(sed 's/[.[\*^$]/\\&/g' file2.txt) | grep -f - /root/listoffiles/*php >> found.txt
답변2
단어 목록에서 패턴을 만드세요. , , 및 , file1.txt
포함 에서 정규식을 가져와야 합니다(ERE 구문에서 ) .one
un
eins
file2.txt
two
deux
zwei
(one|un|eins).*(two|deux|zwei)
단어 목록에 정규 표현식의 특수 문자가 포함되어 있지 않은 경우 해야 할 일은 |
개행 문자(마지막 문자 제외)를 ("or" 연산자)로 바꾸는 것뿐입니다.
words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"
단어 목록에 특수 문자가 포함될 수 있으면 해당 문자를 인용해야 합니다.
words1=$(<file1.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"
단어의 순서에 신경 쓰지 않고 중복 일치를 허용할 수 있는 경우(예: 및 twone
둘 다 허용 ) grep 호출은 두 번만 필요합니다.one
two
grep -f file1.txt | grep -f file2.txt