입력 파일에서 두 가지 grep 방법의 차이점

입력 파일에서 두 가지 grep 방법의 차이점

입력 파일이 있는데 이를 scan.data라고 부르겠습니다. 여기에는 내가 파악하고 싶은 단어 목록이 포함되어 있습니다. 이 작업을 수행하는 두 가지 다른 방법을 찾았지만 결과는 매우 다릅니다.

IFS=$' '    
find / -type f -exec grep -a -D skip -wo $(<scan.data) '{}' \;

이것은 3,799개의 게임을 제공합니다.

find / -type f -exec grep -a -D skip -of scan.data '{}' \;

이것은 나에게 18,167개의 게임을 제공한다.

내가 이해한 바에 따르면 IFS를 설정하면 하위 쉘의 내용을 목록으로 출력할 수 있으며 기본적으로 두 번째 경우의 기능을 미러링할 수 있습니다. 그렇다면 두 사람의 결과가 이렇게 큰 차이를 보이는 이유는 무엇일까?

답변1

명령 대체가 인용되어 있고(그렇지 않은 경우에 있는 대부분의 단어는 scan.data실행할 파일 이름으로 처리됨 grep) 파일의 첫 번째 단어가 대시로 시작하지 않는다고 가정합니다(그렇다면 아마도 옵션으로 해석될 것입니다). grep두 호출은 사용된 옵션을 제외하면 본질적으로 동일합니다. 첫 번째 변형에는 많은 양의 데이터가 포함된 경우 scan.data"매개변수 목록이 너무 깁니다." 오류가 발생할 수도 있습니다.

  1. 첫 번째는 grep정규식 -w에서 읽은 패턴을 사용하여 scan.data일치를 시도합니다 .완전한 단어find유틸리티에 제공된 파일의 각 줄에서 the(아니요) 의 시작 부분과 일치합니다 theodore.
  2. 두 번째 것은 grep사용되지 않습니다 -w. 정규식에서 읽은 패턴을 사용하여 scan.data일치를 시도합니다.하위 문자열find유틸리티에 제공된 파일의 각 줄에( the의 시작 부분에서 일치함 theodore)

이것은 당신이 얻는 일치 수의 차이를 설명할 수 있습니다.

유틸리티가 파일의 패턴을 정규식 -F이 아닌 문자열로 사용하도록 하려는 경우(패턴 파일의 정규식에 특수 문자가 포함되어 있지만 문자 그대로 일치해야 하는 경우(예: 등)).grepscan.data.[*

파일에 패턴이 있는 경우 -f. 명령 대체를 사용하는 것이 가능하지만 제한된 경우에만 가능합니다(이 답변의 상단에 언급된 것처럼 첫 번째 문자열에 초기 대시가 없고 적당한 양의 문자열만 있음). 이 옵션이 있으면 -f명령 대체 사용이 전혀 필요하지 않습니다.

관련 정보