find를 grep으로 파이핑할 때 grep의 일치 강조 표시를 어떻게 유지할 수 있습니까?

find를 grep으로 파이핑할 때 grep의 일치 강조 표시를 어떻게 유지할 수 있습니까?

을 실행하면 grep foo bar.txtgrep은 에서 "foo"의 각 항목을 강조 표시합니다 bar.txt. 하지만 때로는 grep이 검색하는 파일을 결정하는 데 사용하고 싶습니다 find. 그래서 저는 다음과 같은 일을 합니다:

find . -iname "*.abc" | xargs grep foo

아니면 이거:

find . -iname "*.abc" -exec grep foo {} \;

두 경우 모두 grep은 지정된 파일에서 "foo" 항목을 올바르게 찾았지만 출력에는 강조 표시가 전혀 없습니다.

find강조 표시를 잃지 않고 grep에서 검색할 파일을 계속 선택하려면 어떻게 해야 합니까 ?

저는 bash를 쉘로 사용하여 Ubuntu 12.04에서 Gnome Terminal 3.4.1.1을 실행하고 있습니다.

답변1

두 명령 모두에서 문제는 grep다른 명령이 실제 출력( 각각 xargsfind)을 생성한다는 것입니다.

grep각 파일 이름을 직접 호출하여 이 문제를 해결할 수 있습니다 .

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

또는 한 줄로:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

작동 방식:

  • IFS=$'\n'내부 필드 구분 기호를 개행 문자로 설정합니다(또는 파일 이름의 공백으로 인해 문제가 발생함).

  • for FILE in $(COMMAND); do COMMANDS done에서 지정한 파일을 반복하고 COMMAND변수를 FILE현재 파일로 설정한 다음 실행합니다 COMMANDS.

  • grep foo $FILEfooin을 검색하여 $FILE결과를 보냅니다.곧장화면에.

  • unset IFS내부 필드 구분 기호를 다시 기본값으로 설정합니다(스크립트에는 필요하지 않음).

답변2

grep색상을 다시 출력 하면 됩니다 .

나는 여기서 비슷한 일을했습니다.grep에서 일치 항목에 대한 추가 데이터 가져오기

관련 정보