패턴의 시작과 끝으로 두 입력 파일의 줄을 사용하여 여러 파일을 grep하는 방법은 무엇입니까?

패턴의 시작과 끝으로 두 입력 파일의 줄을 사용하여 여러 파일을 grep하는 방법은 무엇입니까?

grep을 사용하여 파일 목록을 검색하는 간단한 스크립트를 작성하고 싶습니다. 현재 코드는 다음과 유사합니다.

a= file1.txt 

b= file2.txt

for

do

grep '$a.*$b' /root/listoffiles/*php >> found.txt

완벽한

file1file2다 단어 목록입니다. 따라서 여러 기준을 사용하여 목적지를 검색합니다. 예를 들어 $a"hello"와 "world"가 될 수도 있고 $b, 두 번째 줄이 "red"와 "tshirt"가 될 수도 있습니다. 두 가지 기준이 일치하는 항목을 찾으면 파일에 저장합니다. 내가 사용하고 있는 루프가 작동하지 않으며 충분히 효율적이지 않습니다. 나는 단지 기준에 맞는 결과를 원할 뿐입니다. 어떤 제안이 있으십니까?

답변1

당신이 먼저해야특수문자 탈출두 파일 모두에(있는 경우) 그런 다음 이를 통해 결합합니다. 예를 들어 '를 paste통해 사용할 수 있는 패턴 목록이 생성됩니다 . 파일이 너무 많지 않는 한 여러 인수 로 루프가 필요하지 않습니다. 받아들여질 수 있습니다:grep-fgrep

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 구문에서 ) .oneuneinsfile2.txttwodeuxzwei

(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 호출은 두 번만 필요합니다.onetwo

grep -f file1.txt | grep -f file2.txt

관련 정보