Embedded : : Linux/: : Linux

grep 으로 리눅스 커널 소스에서 특정 keyword 찾기

Jay.P Morgan 2024. 10. 12. 01:04

 

 

  pi@sarpberrypi:~ $  grep -rn 

 

grep을 사용하여 커널 소스에서 특정 문구를 찾는 것은 커널 엔지니어의 가장 기본적인 '무기'입니다. 하지만 리눅스 커널은 소스 양이 방대하기 때문에, 효율적인 옵션을 사용하는 것이 아침 공부 시간을 아끼는 지름길입니다.

가장 빠르고 정확한 방법 3가지를 정리해 드립니다.

 

 

  1.  Recursive Search: 가장 표준적인 방법

 

커널 소스 루트 디렉토리에서 아래 명령어를 입력하세요.

 
  pi@raspberrypi:~/rpi_kernel_src/linux/ $ grep -rn "tsk->flags |= PF_EXITPIDONE;" .
 

 

       -r: 하위 디렉토리까지 모두 뒤집니다 (Recursive).

       -n: 파일 내의 몇 번째 줄(Line number)에 있는지 표시합니다. (수정하거나 분석할 때 필수!)

       .: 현재 디렉토리부터 찾으라는 뜻입니다.

 

가장 기본적인 형태는 다음과 같습니다.


  pi@raspberrypi
:~/rpi_kernel_src/linux/ $ grep -옵션 "패턴" [파일명]
 

 

 

실전 예시

① 파일 안에서 특정 단어 찾기

error.log 파일에서 "error"라는 단어가 포함된 모든 줄을 찾고 싶을 때:


  pi@raspberrypi
:~/rpi_kernel_src/linux/ $ grep "error" error.log
 
 

② 대소문자 무시하고 줄 번호와 함께 찾기

"Apple", "apple", "APPLE" 등을 모두 찾고 싶을 때 -i를 쓰고, 위치를 알기 위해 -n을 추가합니다.


  pi@raspberrypi
:~/rpi_kernel_src/linux/ $ grep -in "apple" fruit.txt
 
 

③ 파이프(|)와 함께 사용하기 (가장 많이 쓰임!)

다른 명령어의 결과물에서 특정 정보만 필터링할 때 유용합니다.

       실행 중인 프로세스 확인: ps -ef | grep "python"

       특정 파일 목록 찾기:  ls -al | grep ".conf"

 

④ 여러 단어 제외하고 보기

"success"가 들어간 줄만 빼고 보고 싶다면 -v를 사용하세요.


  pi@raspberrypi
:~/rpi_kernel_src/linux/ $ tail -f access.log | grep -v "success"
 

 

 

 

 

  2.  검색 속도를 높이는 방법: grep + 특정 디렉토리

 

지금 프로세스 종료(do_exit) 관련 부분을 보고 계시므로, 전체를 다 찾기보다 관련 서브시스템 디렉토리만 찍어서 찾는 게 훨씬 빠릅니다.

 

 
  pi@raspberrypi:~/rpi_kernel_src/linux/ $ grep -rn "tsk->flags |= PF_EXITPIDONE;" kernel/sched/
 

 

       보통 프로세스 관리 로직은 kernel/ 디렉토리에 모여 있습니다.

 

 

  3.  특수 문자 처리 (Escape)

 

|나 > 같은 기호는 쉘(Shell)에서 특수한 의미로 쓰일 수 있으므로, 문구 전체를 작은따옴표('')로 감싸주는 것이 가장 안전합니다. 만약 검색이 잘 안 된다면 아래처럼 대입 연산자 부분만 찾아보세요.

 
  pi@raspberrypi:~/rpi_kernel_src/linux/ $ grep -rn '|= PF_EXITPIDONE;' kernel/s
 

 

 

※ 정규 표현식 활용 (고수 단계)

단순한 단어가 아니라 복잡한 패턴을 찾을 때 유용합니다.

       ^ (줄의 시작): grep "^Start" file.txt (Start로 시작하는 줄)

       $ (줄의 끝): grep "End$" file.txt (End로 끝나는 줄)

       . (아무 문자 하나): grep "a.c" file.txt (abc, akc, a1c 등)

 

 

💡 팁: 만약 여러 개의 패턴을 동시에 찾고 싶다면 grep -E "pattern1 | pattern2" 처럼 -E 옵션(Extended Regex)을 사용하면 편리합니다.

 

 

 

 

  4. 자주 사용하는 옵션

 

grep의 진가는 옵션을 섞어 쓸 때 발휘됩니다.

옵션 설명
-i 대소문자를 구분하지 않음 (Ignore case)
-v 패턴과 일치하지 않는 줄만 출력 (Invert match)
-r 하위 디렉토리까지 모든 파일 검색 (Recursive)
-n 줄 번호를 함께 표시 (Line number)
-w 단어 단위로 정확히 일치해야 함 (Word)
-c 일치하는 줄의 개수만 출력 (Count)

 

 

 

  💡 전문가를 위한 '고급 도구' 추천

 

 

grep도 좋지만, 커널 소스처럼 수백만 라인의 코드를 분석할 때는 아래 도구들이 훨씬 강력합니다.

 

  (1) rg (Ripgrep): grep보다 압도적으로 빠릅니다. (Rust 기반)

 
  pi@raspberrypi:~/rpi_kernel_src/linux/ $ rg "PF_EXITPIDONE"
 

 

  (2) cscope 또는 ctags: 함수나 매크로가 정의된 곳으로 바로 점프할 수 있습니다. make cscope 명령어로 인덱스를 미리 만들어두면 좋습니다.

 

  (3) LXR (Linux Cross Reference): 웹 브라우저에서 소스를 타고 들어갈 때 유용합니다. elixir.bootlin.com 사이트를 즐겨찾기 해두세요.

 

 

 

  🧪 잠깐! 소스 분석 팁

 

 

찾으시려는 PF_EXITPIDONE은 태스크가 종료 절차를 거의 마쳤음을 알리는 플래그입니다. 이 플래그가 세팅된 이후에는 스케줄러가 이 태스크를 어떻게 취급하는지, 그리고 락(Lock)들이 어떻게 해제되는지 연결해서 보시면 "아, 이래서 여기서 플래그를 세우는구나!" 하고 감이 오실 겁니다.

 

'Embedded : : Linux > : : Linux' 카테고리의 다른 글

repo 명령어 정리  (3) 2024.11.12
[shell script] "$*" 과 "$@"의 차이  (0) 2024.10.12
Linux Module Programming  (0) 2024.10.11
리눅스의 디렉터리 구조  (1) 2024.10.07
Linux, 부팅, Swap, Dependency, Boosting  (0) 2024.04.24