두 가지 찾기 명령 비교


12

최근에 나는이 find한 줄짜리를 받았지만 아래 두 가지의 차이점이 어디에서 오는지 설명 할 수 없습니다.

실시 예 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

실시 예 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

보시다시피, 첫 번째 파일에는이 문자열에서 파생 된 특정 파일이 있으며 지금까지는 왜 이런 일이 발생하는지 알 수 없습니다.

답변:


17

grep에게 2 개의 위치를 ​​검색하도록 지시하고 있습니다. grep은 여러 위치를 검색 한 경우 전체 위치 만 표시합니다.

예를 들어

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

하나의 파일 만 검색하면 grep이 파일 이름을 생략하는 방법에 주목하십시오.

grep -i "foo" /tmp/herp
foo

그러나 여러 검색 위치를 지정하면 grep은 각 일치 항목을 찾은 위치를 말합니다

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

추가하면 /dev/null2 개의 인수를 제공하여 grep을 속여 전체 경로를 인쇄합니다.


1
+1이지만 "명백한"언급을 잊었습니다. "추가 된 파일 /dev/null은 grep-ed가 (빈) /dev/null파일 에서 찾을 수 없으므로 올바른 위치 만 출력되도록하기위한 것입니다."
Olivier Dulac

또한 검색 /dev/null을 통해 비어 있지 않은 더미 파일을 통해 시간을 낭비하지 않아도됩니다. 마지막으로, 검색의 의도는 /dev/null이 관용구에 익숙한 사람들에게는 분명합니다.
Alexis

5

man grep:

-H, --with 파일 이름

각 일치에 대한 파일 이름을 인쇄하십시오. 검색 할 파일이 둘 이상인 경우 이것이 기본값입니다.

차이점은 두 경우에 하나 또는 두 개의 파일 인수로 grep을 호출 한 결과입니다. 추가하는 대신 인수를 사용하여 /dev/null호출 할 수 있습니다. 아마 행동은 더 광범위하게 지원됩니다.grep-H/dev/null


3
grep -H/dev/nullGNU grep없이 작동 하는 트릭입니다.
Chris Down

4

첫 번째 예는 find표현식 의 결과로 찾은 각 파일에 대해 두 파일에서 grep을 실행하는 것과 같습니다 . 예를 들어, 경우를 find발견 세 개의 파일 a.txt, b.txt그리고 c.txt다음이 grep로 실행됩니다

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

되는 grep출력이 일치하는 파일 이름을 표시합니다. / dev / null과 일치하는 것은 없으므로 첫 번째 파일의 파일 이름이 일치하면 인쇄됩니다.

반면 두 번째 예는

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

이 경우 하나의 인수 만 있기 때문에 일치하는 파일 이름이 인쇄되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.