2011-09-28 12 views
2

텍스트 파일 세트가 들어있는 폴더가 있습니다.리눅스 검색 파일에서 복수 단어

-Folder 
--- file 1 
--- file 2 
--- file 3 
--- file 4 

나는 내부에 있는지 확인하고 싶은 단어가 있습니다. {word1, username, blah blahblah}

하나의 명령으로 내 목록의 모든 단어가 들어있는 파일을 찾을 수 있습니까?

grep과 함께 사용할 수도 있지만 내 생각에 그들은 한 줄로 작업한다고 생각하지만 내 경우에는 항상 다른 줄에 있습니다.

단어 수가 고정적입니다. 항상 3 또는 4 그래서 나는 명령에 그들을 하드 코딩 할 수 있습니다.

편집 : 이들은 AND입니다. 내부에 파일이 모두 들어 있지 않으면 파일을 사용할 수 없습니다. 나는 egrep -l 'word1'을 수행하지 않으려합니다. xargs egrep -l 'word2'

grep을 한 번 호출하는 더 좋은 해결책이 있습니까?

건배, 인트

답변

7

이 방법이 유용합니까?

grep -IRE 'word1|username|blah blahblah' /path/to/files/ | 
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' | 
awk -F: '$1!=p{if(b"" && c > 2)print b; p=$1;c=0;b=s=""}{b=b s $0;s=RS;c++}END 
{if(b"" && c > 2)print b}' | awk -F: '{print $1}' | sort -u 

첫 번째 부분 (grep)은 일치하는 패턴의 모든 파일 이름을 나열합니다. 두 번째 부분 (sed)은 유일한 출력을주는 첫 번째 출력에서 ​​복제본을 제거합니다. 세 번째 부분은 두 번 이상 나타나는 파일 만 표시하고 네 번째 파일은 일치하는 패턴을 제거하고 마지막 파일은 내 친구의 파일 이름 만 제공합니다.

내 머리가 아프다 ...

4

사용 :

grep -f words.txt input 

예 :

$ cat words 
word1 
username 
blah blahbla 

a 
word1 
username blah blahblah 
b 
username blah blahblah 
c 
word1 
d 
word1, username, blah blahblah} 

$ grep -f words.txt * 
a:word1 
a:username blah blahblah 
b:username blah blahblah 
c:word1 
d:word1, username, blah blahblah} 
3

사용 GREP이 :

grep -E '(word1|username|blah blahblah)' Folder/* 

-E 플래그로 GREP을두고 정규식의 경우 '확장'모드입니다. 기본적으로 파일 이름과 일치하는 텍스트가 표시됩니다. 파일 이름 만 원하는 경우 -l을 옵션에 추가하십시오. 단어의 작은 집합에 가장 적합한

+0

이 작동하지 않습니다.'(| word2 단어 1)'(다른 라인) word2 word3 word4 word5 내가 그렙 -E를 사용하는 경우 단어 1 테 현재 폴더의 파일에 1이 포함되어 있습니다. 나는 비어있다. – Stefano

+0

일부 배포판에는'grep -E'와 동일한'egrep'과'grep'과 다른 모든 옵션이있다. –

1

또 다른 해결책 :

grep -e word1 -e username -e "blah blahblah" Folder/* 
+0

문제는 많은 시간을 파일의 이름으로 반환합니다. 중복을 피할 수있는 방법이 있습니까? – Stefano

1

당신이

egrep -E '{word1|username|blah blahblah)' `find . -type f -print` 

난 당신이 또한 용어를 사용하는 것이 좋습니다 디렉토리 트리에 grep을하려면 다음을 디렉토리에 대한 답변을 검색 할 때 폴더 대신 디렉토리를 사용하십시오 :-)