파일의 어느 곳에서나 (서로 가깝지는 않지만) 두 개의 문자열, 즉 각 문자열의 전체 섹션을 찾기 위한 올바른 구문을 찾으려고 노력하고 있습니다. 따라서 foo
숫자와 숫자를 모두 포함하는 파일은 321
단독으로 존재할 필요가 없으며 하위 문자열일 수 있으며 일치해야 합니다. 나는 운없이 다음을 시도했습니다.
grep 'foo\|321' *
grep 'foo|321'
답변1
GNU grep
grep
두 번째 파일은 파일 목록에서 작동하므로 조금 더 빨라야 합니다 .
grep -lZ 'foo' * | xargs -0 grep -l '321'
POSIX grep 및 찾기
find
재귀 디렉터리를 검색하려는 경우 더 유용합니다(이 경우 -mindepth
및 -maxdepth
옵션이 누락되었습니다.
find . -mindepth 1 -maxdepth 1 -type f -exec grep -q 'foo' {} \; -exec grep -l '321' {} +
답변2
짧은 스크립트를 사용하여 이 작업을 수행할 수 있습니다.
for FILE in *
do
grep -q foo $FILE && grep -q 321 $FILE && echo $FILE
done
한 줄로 이 작업을 수행할 수도 있습니다.
for FILE in *; do grep -q foo $FILE && grep -q 321 $FILE && echo $FILE; done
grep
문자열이 발견되면 0(true)을 반환하고 &&
명령을 구분한다는 것은 첫 번째 명령이 true인 경우에만 두 번째 명령이 실행된다는 의미입니다. 이 -q
옵션을 사용하면 grep
아무 것도 출력되지 않습니다.
echo는 두 문자열이 모두 동일한 파일에 있는 경우에만 실행됩니다.
나는 이것을 수행하는 다른 방법을 생각했습니다. 이 방법은 grep
각 파일을 한 번만 반복 하면 되므로 문제의 파일이 설치된 RAM보다 큰 경우 더 효율적일 수 있습니다 .
for FILE in *
do
test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE
done
한 줄 버전은 다음과 같습니다.
for FILE in *; do test $(egrep -o "foo|321" $FILE | uniq | sort | uniq | wc -l) -eq 2 && echo $FILE; done
답변3
이상한. 나에게는 두 가지 변형이 모두 작동합니다(grep(GNU grep) 2.13).
grep 'foo\|321'
grep -E 'foo|321'
편집 1- 일치하는 파일 2개만 표시
대답은 for file in *
효과가 있지만 (파일 수가 많은 경우) 성능상의 악몽이 될 수 있습니다. 파일당 프로세스가 최소 2개 이상입니다. (GNU 세계에서는) 이것이 더 빠릅니다:
find . -type f -print0 | xargs -0 -r grep --files-with-matches --null -- string1 |
xargs -0 -r grep --files-with-matches -- string2
string1은 더 적은 수의 일치 항목을 생성하는 항목이어야 합니다.
답변4
~해야 한다
grep -e "foo" -e "321" *
-e를 사용하여 여러 모드를 나타냅니다.
편집하다
둘 다 일치해야 하는 경우:
grep -e ".*foo.*321.*" *
순서가 중요하지 않은 경우:
grep -e ".*foo.*321.*" ".*321.*foo.*" *