반응형

테스트한 OS: Ubuntu 12.04

쉘(shell): bash



* grep만 이용하는 방법


리눅스에서 파일 내에 있는 특정 문자열을 검색할 때 쓰는 grep에 옵션을 더하면 현재 위치에서 하위 디렉토리에 있는 파일들까지 검색을 수행할 수 있다. Ubuntu에서는 grep가 하위 폴더 검색까지 지원하기 때문에 아래와 같이 간단하게 해결할 수 있다.


$ grep -rn "찾고자 하는 문자열" *


-r 옵션은 하위 디렉토리에 있는 파일까지 검색하겠다는 것이고,

-n 옵션은 라인 번호를 보여주는 것이다.

그리고 검색하는 문자열에 공백이 있다면 앞뒤에 따옴표가 반드시 있어야 한다.


그냥 저렇게 실행하면 검색결과보다 "No such file or directory"와 같은 오류 메세지가 더 많이 뜨는 경우도 있다. 이 때는 명령에 "2> /dev/null"을 붙여서 검색 결과만 남겨 두고 에러 메세지는 보이지 않도록 처리할 수 있다. 아래 그림은 openwrt의 build_root 디렉토리 하위의 모든 파일들에 대해서 "setup_fname_info(struct"라는 문자열을 검색한 결과이다.





* find와 grep를 같이 이용하는 방법


그런데 리눅스 배포판에 따라서 grep의 하위 디렉토리 검색이 안되는 경우도 있다고 한다. 어디서 안되는지는 사실 모르겠다. 라우터에 들어가는 매우 가벼운 OpenWRT에서조차 -rn 옵션이 작동하는데 어디서 안되는 것일지?

어쨌든 조금 길고 복잡하지만 같은 목적을 갖는 다른 방법으로 find를 같이 이용하는 방법이 있다.


$ find . -name "*" | xargs grep -n "찾고자 하는 문자열"


참고로 grep와는 달리 find를 쓸 때의 좋은 점은 정규식을 통해서 검색할 파일의 범위를 지정할 수 있는 것이다. 예를 들면, 하위 디렉토리의 모든 .c 또는 .h 파일에 대해서만 검색을 수행하고자 할 때 아래와 같이 할 수 있다.


$ find . -name "*.[ch]" | xargs grep -n "찾고자 하는 문자열"



앞선 예제와 같은 조건에 대해서 find를 이용한 검색 화면은 아래와 같다. 참고로 맨 끝에 붙인 "--color=auto" 옵션은 텍스트와 라인 번호, 키워드 강조 색상을 주기 위해서 필요하다. "--color=auto" 옵션이 없으면 그냥 단색의 결과만 나타난다.




참고로 위의 grep -rn과 달리 검색결과가 3개만 나오는 이유 2가지는 다음과 같다.

 

 - 확인 결과 grep에서 나온 첫번째와 두번째 검색 결과는 같은 파일이다. 경로상에서 보면 build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux-3.10.32는 실제로 존재하는 경로이고, build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux는 같은 위치에 대한 바로가기 링크이다. 즉, grep는 링크도 무시하지 않고 똑같이 하위 디렉토리로 간주하고 검색한다는 얘기.


 - "xmit.c~" 파일은 xmit.c의 백업 파일인데 확장자가 "c~"기 때문에 c와 h 파일만 찾는 정규식에 의해 검색에서 제외되었다.



반응형
블로그 이미지

Bryan_

,