터미널에서 간단한 코딩 작업을 할 때 은근히 필요한 게

 

다른 파일에서 특정 단어나 표현을 찾는 것이다.

 

 

예를 들어 함수 foo가 a.py에 정의되어 있는데,

 

원래는 2개의 인수를 받아 foo(x, y)처럼 동작하던 것을 3개의 인수를 받아 foo(x, y, z)처럼 사용하도록 수정했다고 하자.

 

다음과 같은 명령어로 현재 디렉터리의 파이썬 스크립트로부터 foo라는 텍스트의 위치를 찾을 수 있다.

$ grep -n foo ./*.py
# recursive하게 하위 폴더도 찾아보고 싶으면,
$ grep -nr foo --include="*.py"

 

foo 대신에 PixelShuffle 함수를 찾도록 하면 아래와 같이 나오더라.

rdn_f.py:76: nn.PixelShuffle(r),
rdn_f.py:82: nn.PixelShuffle(2),
rdn_f.py:84: nn.PixelShuffle(2),
msrn.py:43: nn.PixelShuffle(args.scale),

rdn_f.py의 76, 82, 84번째 줄에 해당 함수가 사용되었다는 뜻이다.

$ vi rdn_f.py +76

으로 바로 76번째 줄을 수정하러 갈 수 있다.

 

 

몇 가지 옵션이 있는데,

  • -n이 없으면 line number가 나오지 않는다. 웬만하면 line number가 필요하지 않을까?
  • -r과 --include가 있는 스크립트는 하위 폴더에도 똑같은 연산을 recursive 하게 수행한다.
    -r 대신에 -R을 사용하면 symbolic link도 따라간다고 하는데, 썩 좋은 생각은 아닌 것 같다.

 

막상 해당 단어를 찾기는 했는데, 한 줄만 딸랑 나와서 전후 맥락을 파악하기 힘든 경우에는

 

아래와 같은 방법도 있다.

# 앞으로 (Before) 3줄, 뒤로 (After) 2줄이 추가로 나온다.
# 빈 줄은 센스있게 제거해주더라.
$ grep -n foo ./*.py -A 2 -B 3

+ Recent posts