grep은 다른 파일 경로가 아닌 하나의 파일 경로에 대해 작동합니다.

grep은 다른 파일 경로가 아닌 하나의 파일 경로에 대해 작동합니다.

각각 수천 개의 파일이 포함된 두 개의 디렉토리가 있고 파일에서 특정 IP를 수집하려고 합니다. 내 grep 문자열은 다음과 같습니다

grep "IP" cdr/173/07/cdr_2018_07*

이 grep 문자열은 "grep: 인수 목록이 너무 김"을 반환합니다. 그러나 다음을 수행할 때:

grep "IP" cdr/173/06/cdr_2018_06*

내가 찾고 있는 것을 반환합니다.

아래는 각 디렉토리의 상위 디렉토리에 대한 ls -l입니다. 차이가 약 400KB인 것 같으니 여기서는 크기가 실제로 문제인지 잘 모르겠습니다. 내가 뭐 놓친 거 없니?

jeblin@debian:~$ ls -l cdr/173
total 18500
REDACTED
drwxr-xr-x 2 jeblin jeblin 2781184 Jul  2 09:34 06
drwxr-xr-x 2 jeblin jeblin 2826240 Aug  1 07:33 07

차이점이 있다면 이 프로세스(여러 IP 검색)를 자동화하기 위해 Python 스크립트를 작성했는데 06에서는 작동했지만 07에서는 작동하지 않았기 때문에 처음으로 수동 grep 검색을 시도했습니다.

답변1

쉘이 호출할 수 없는 파일이 너무 많거나, 오히려 외부 유틸리티를 호출하는 데 사용되는 명령줄 길이에 제한이 있으며1, grep 이 확장된 글로빙 패턴을 사용하여 호출하려고 할 때 충돌합니다.grepcdr/173/07/cdr_2018_07*

당신이 할 수 있는 일은 각 파일을 개별적으로 grep하는 것입니다.

for pathname in cdr/173/07/cdr_2018_07*; do
    grep "IP" "$pathname" /dev/null
done

여기서 extra는 일치하는 파일의 파일 이름을 항상 보고하도록 /dev/null강제하거나 다음을 사용할 수 있습니다 .grepfind

find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
    -exec grep "IP" /dev/null {} +

grep가능한 한 많은 일치하는 경로 이름을 사용하여 호출이 이루어지므로 이 방법이 더 효율적입니다.가능한 한 많이일괄적으로.

cd처음 에 들어가서 cdr/173/07해보면 그럴 수도 있어요.

grep "IP" cdr_2018_07*

그것가능한디렉토리 비트를 포함하지 않기 때문에 결과 파일 이름 목록이 더 짧아질 수 있으므로 아마도 44.7k 파일의 한계에 매우 가까울 것이므로 특히 숫자가 예상되는 경우 이 작업을 수행하는 다른 방법으로 이동하는 것을 심각하게 고려해야 합니다. 파일 수가 해당 숫자 주위에서 변동합니다.

관련된:


1 제한은 명령줄의 길이와환경(각 인수의 길이와 환경 변수의 이름 및 값의 합계, 해당 포인터도 고려) 이는 execve()외부 명령을 실행하기 위해 쉘에서 사용하는 시스템 호출에 의해 부과되는 제한입니다. 등과 같은 내장 명령에는 echo이 문제가 없습니다.

답변2

문제는 쉘 명령에 허용되는 최대 바이트 수에 대한 제한입니다.

*디렉터리에 있는 모든 파일의 전체 목록으로 확장되므로 중요한 파일 크기가 아니라 파일 이름 길이와 파일 수가 중요합니다.

를 실행하여 컴퓨터의 바이트 제한을 확인할 수 있습니다 $ getconf ARG_MAX. 이 제한은 셸 자체가 아닌 운영 체제/커널에 의해 적용됩니다.

이를 방지하는 한 가지 방법은 find를 사용하는 것입니다.

$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;

답변3

나는 다음 사항을 바탕으로 질문에 대답하고 있습니다. - 두 개의 디렉토리가 있습니다. - 1)cdr/173/07 2)cdr/173/06

이 두 디렉토리에는 검색해야 할 파일이 많이 있을 수 있습니다.

a) 아래는 첫 번째 해결 방법입니다.

grep -r "IP" cdr/173/07 -e "IP" cdr/173/06

b) 그러나 다른 많은 디렉토리를 검색하려면 다음을 사용할 수 있습니다.

grep -r "IP" cdr/173/*

c) 1000개의 파일이 있고 특정 유형의 파일만 검색한다고 가정합니다. grep -r "IP" cdr/173/07/cdr_2018_07* -e grep "IP" cdr/173/06/cdr_2018_06*

관련 정보