2011-11-01 4 views
4

내 질문에 두 부분으로 :/디렉토리에 대해 grep이 멈추는 이유는 무엇입니까?

1) "/"아래에있는 모든 파일을 grep 할 때 grep이 멈추는 이유는 무엇입니까? 예를 들어

:

grep -r 'h' ./ 

(참고 : 오른쪽 요령/충돌하기 전에, 나는

의 .... 나는 소켓에 대한 일부 "이러한 장치 또는 주소"메시지를 볼 수 있습니다 물론 grep은 소켓에 대해 실행해서는 안된다는 것을 알고 있지만, 소켓은 Unix의 파일이기 때문에 충돌이 아닌 음의 결과를 리턴해야한다고 생각합니다. : 어쨌든 - 어떻게 전체 파일 시스템을 grep 할 수 있습니까? 이 일을 할 때 우리가 남겨 두어야 할 특정 * NIX 디렉토리가 있습니까? 특히 최근 작성된 모든 로그 파일을 찾고 있습니다.

+0

grep이 (가) 걸려 있지 않은 경우, -r은 시스템의 모든 재귀 적 파일을 의미합니다. 얼마나 많은 기가 바이트입니까? 또한 NFS 마운트 파일은 네트워크 연결 속도로 처리되고 CPU에 직접 연결된 디스크의 로컬 파일로 처리되지 않습니다. 그것은 오랜 시간이 걸릴 것입니다. 행운을 빕니다. – shellter

답변

1

오류 메시지가 계속 표시되면 grep이 걸려 있지 않습니다. 두 번째 창에 iotop을 열어 두어 시스템이 얼마나 힘든 지 확인하십시오. 모두 내용을 저장 매체에서 내용을 하나씩 주 메모리에 저장하십시오. 이 작업은 느려야하거나 매우 베어 본 시스템을 사용해야합니다.

이제, 필자의 후속 질문 : 어떤 경우에도 - 전체 파일 시스템을 어떻게 grep 할 수 있습니까? 이 일을 할 때 우리가 남겨 두어야 할 특정 * NIX 디렉토리가 있습니까? 특히, 최근에 작성한 모든 로그 파일을 찾고 있습니다.

전체 FS를 그렙하는 것은 거의 좋은 생각이 아닙니다. 로그 파일을 작성해야하는 디렉토리를 grepping하십시오. 가능성이 /var/log입니다. 더 좋은 점은 찾고있는 파일의 이름을 아는 경우 (예 : 확장자가 .log 인 경우) find 또는 locategrep은 해당 프로그램에서보고 한 파일입니다.

+0

iotop? sudo yum install iotop을 시도했는데 실패했습니다. ? – jayunit100

+0

@ jayunit100 : http://www.ndchost.com/wiki/server-administration/installingi-iotop-centos5 –

8

기본적으로 grep은 모든 파일을 읽으려고합니다. 장치 파일, 소켓 파일 및 FIFO 파일을 건너 뛰려면 -D skip을 사용하십시오.

13

@ninjalj가 말한 것처럼 -D skip을 사용하지 않으면 grep은 모든 장치 파일, 소켓 파일 및 FIFO 파일을 읽으려고 시도합니다. 특히 Linux 시스템 (및 많은 Unix 시스템)에서는 무한히 긴 것으로 보이는 /dev/zero을 읽으려고 시도합니다.

당신은 잠시 기다릴 것입니다.

시스템 로그를 찾으려면 /var/log에서 시작하는 것이 가장 좋은 방법 일 것입니다.

당신이 정말로 당신의 파일 시스템에 어디서든 할 수있는 일을 찾고 있다면,이 같은 작업을 수행 할 수 있습니다

find/-xdev -type f -print0 | xargs -0 grep -H pattern 

find-xdev 인수는 단일 파일 시스템 내에서 체류를 알려줍니다; 이렇게하면 /proc/dev (및 마운트 된 파일 시스템)을 피할 수 있습니다. -type f은 검색을 일반 파일로 제한합니다.-print0은 개행 문자 대신 널 문자로 분리 된 파일 이름을 인쇄합니다. 이렇게하면 파일에 공백이나 다른 재미있는 문자가 포함 된 파일에 문제가 발생하지 않습니다.

xargs은 표준 입력에서 파일 이름 목록 (또는 다른 것)을 읽고 목록의 모든 항목에 대해 지정된 명령을 호출합니다. -0 옵션은 find-print0에서 작동합니다.

에 대한 -H 옵션은 각 일치 앞에 파일 이름을 붙이도록 지시합니다. 기본적으로 grep은 명령 줄에 둘 이상의 파일 이름이있는 경우에만이 작업을 수행합니다. xargs은 인수를 일괄 처리로 나누기 때문에 마지막 일괄 처리에 파일이 하나만있을 수 있으므로 결과가 일관되지 않을 수 있습니다.

(예 : 이름이 로그 파일을 가정) .log로 끝나는 이름을 가진 파일에 대한 검색을 제한 할 find ... -name '*.log'를 사용하여, 및/또는 바이너리 파일을 건너 뛸 grep -I ...을 사용하는 것이 좋습니다.

모든 사항은 GNU 특정 기능에 따라 달라집니다. 이 옵션 중 일부는 MacOS (BSD 기반) 나 다른 Unix 시스템에서는 사용할 수 없습니다. 로컬 설명서를 참조하고 GNU findutils (findxargs) 및/또는 GNU grep 설치를 고려하십시오.

이 중 하나를 시도하기 전에 df을 사용하여 루트 파일 시스템의 크기를 확인하십시오. 현재 광산은 268 기가 바이트입니다. 모두 검색하는 데 몇 시간이 걸릴 것입니다. 몇 분 동안 (a) 검색 한 파일을 제한하고 (b) 명령이 올바른지 확인하는 데 지출하는 시간은 충분할 것입니다.

+2

이것은 xargs보다 빠릅니다. find/-xdev -type f -exec grep -H {} +'. – MichalH

관련 문제