GNU grep

GNU grep

파일의 어느 곳에서나 (서로 가깝지는 않지만) 두 개의 문자열, 즉 각 문자열의 전체 섹션을 찾기 위한 올바른 구문을 찾으려고 노력하고 있습니다. 따라서 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.*" *

관련 정보