4 min read · 904 words
#157
윈도우 운영체제를 기반으로 개발이나 시스템 운영 업무를 진행하다 보면 리눅스 환경의 편리한 CLI 명령어들이 그리워질 때가 많다. 특히 로그 파일이나 소스 코드 내에서 특정 문자열을 빠르게 찾아내야 할 때 리눅스의 grep 명령어는 필수적인 도구 중 하나다. 하지만 별도의 설정 없이 윈도우 환경에서 이 명령어를 무작정 실행하면 시스템이 명령을 인식하지 못하는 현상을 겪게 된다. 이번 글에서는 내가 직접 겪은 윈도우 환경에서의 텍스트 검색 실패 사례를 바탕으로, 에러의 근본적인 원인을 짚어보고 이를 깔끔하게 수리할 수 있는 명확한 해결책을 공유하고자 한다.
내가 윈도우 환경에서 특정 텍스트 파일 내의 단어를 검색하기 위해 grep_search를 시도했다. 하지만 시스템은 grep 명령어를 찾지 못하고 에러를 내뿜었다. 리눅스나 맥OS와 같은 유닉스 계열 운영체제에서는 grep이 내장 유틸리티로 기본 탑재되어 있어 어디서나 즉시 호출이 가능하지만, 윈도우는 완전히 다른 커널 구조와 명령어 체계를 가지고 있기 때문이다.
윈도우의 기본 셸 환경인 CMD나 PowerShell grep 명령어 조합은 기본적으로 매칭되지 않는다. 시스템 환경변수인 %PATH% 경로 내에 grep이라는 이름을 가진 실행 파일(.exe)이 존재하지 않는다면, 윈도우는 이 명령어가 무엇인지 전혀 인지할 수 없다. 명령어 프롬프트나 파워쉘 창에 리눅스 스타일 명령어를 그대로 입력했을 때 시스템이 "프로그램을 찾을 수 없다"고 응답하는 이유가 바로 여기에 있다.
에러 증상과 발생 환경
실행 도중 다음과 같은 치명적인 에러를 만났다. 에러 메시지는 시스템이 실행 파일을 찾기 위해 환경변수를 모두 뒤졌으나 실패했음을 명확히 보여준다.
Encountered error in step execution: error executing cascade step: CORTEX_STEP_TYPE_GREP_SEARCH: exec: "grep": executable file not found in %PATH%
문제가 발생한 구체적인 시스템 환경은 다음과 같다.
- OS: Windows 10 / Windows 11
- Shell: PowerShell 5.1 및 PowerShell Core 7
- Runtime: Python 3.12
이 에러는 로컬 개발 환경에서 파워쉘을 이용해 작업을 수행할 때뿐만 아니라, 파이썬 스크립트나 자동화 에이전트 프로그램이 내부적으로 윈도우 셸을 호출하여 텍스트 검색 기능을 실행하려고 할 때도 동일하게 발생한다. 시스템 환경변수에 실행 경로가 올바르게 주입되어 있지 않다면 커널 단계에서 프로세스 생성 자체가 차단된다.
시도했지만 실패한 방법
처음에는 단순히 리눅스에서 사용하듯이 리눅스 스타일의 명령어를 윈도우 CMD나 일반 파워쉘에 바로 던져보았다. 당연하게도 윈도우 커널은 리눅스 내장 유틸리티인 grep을 기본 탑재하고 있지 않기 때문에 바로 에러가 났다.
일부 개발자들은 파워쉘이 리눅스 명령어의 별칭(Alias)을 지원한다는 점을 떠올리고 해결을 시도하기도 한다. 예를 들어 파워쉘에서 ls나 rm 같은 명령어는 윈도우 내장 명령어로 별칭 지정이 되어 있어 정상 작동하기 때문이다. 하지만 grep 명령어의 경우 파워쉘에 별도의 기본 별칭 지정이 되어 있지 않다. 시스템 환경변수를 임의로 수정하지 않고 명령어만 반복해서 입력하는 행위는 문제 해결에 아무런 도움이 되지 않았다.
최종 해결을 위한 두 가지 접근법
이 문제를 해결하는 방법은 크게 두 가지다. 첫째, 윈도우 파워쉘에 내장된 강력한 기본 명령어인 Select-String을 활용하는 것이다. 둘째, Git Bash를 설치하여 시스템 PATH 환경변수에 리눅스 유틸리티 디렉토리를 주입하는 것이다.
방법 1. 파워쉘 내장 명령어 Select-String 활용 (권장)
가장 안전하고 별도의 설치가 필요 없는 방법은 파워쉘이 자체적으로 제공하는 텍스트 검색 명령어인 Select-String을 사용하는 것이다. 이 명령어는 약어로 sls라고도 부르며, 리눅스의 grep과 거의 동일한 역할을 수행한다. 정규 표현식 매칭 기능은 물론이고 파일 시스템 내의 여러 텍스트 파일을 동시에 스캔하는 기능까지 완벽하게 지원한다. 외부 도구를 의존하지 않으므로 보안 정책이 까다로운 운영 서버 환경에서도 즉시 적용 가능하다는 강력한 장점이 있다.
방법 2. 윈도우용 grep 설치 및 PATH 환경변수 주입
만약 반드시 grep이라는 명령어 자체를 유지해야 하는 상황이라면(예: 크로스 플랫폼 스크립트 호환성 유지), 윈도우용 GNU 유틸리티를 설치해야 한다. 가장 대중적인 방법은 개발자 필수 도구인 Git for Windows(Git Bash) 또는 MSYS2를 설치하는 것이다. 이 도구들을 설치하면 내부적으로 grep.exe 파일이 포함되는데, 이 파일이 위치한 디렉토리 경로를 윈도우 시스템 환경변수 %PATH%에 직접 추가해주면 파워쉘에서도 grep 명령어를 리눅스처럼 자유롭게 호출할 수 있게 된다.
실전 적용 코드
문제를 해결하기 위해 적용한 구체적인 파워쉘 명령어 코드는 다음과 같다. 기존에 에러를 유발하던 리눅스 스타일 구문을 파워쉘 표준 방식으로 수정한 형태다.
# 1. 파워쉘 내장 명령어로 텍스트 검색 (Select-String 사용)
# 이전 (문제 코드)
# grep "target_word" ./logs/*.log
# 수정 (fix - 윈도우 파워쉘 표준 명령어 적용)
Select-String -Pattern "target_word" -Path "./logs/*.log"
# 2. 약어(Alias)를 사용한 단축 표현 방식
sls -Pattern "target_word" -Path "./logs/*.log"
# 3. 만약 환경변수 설정 후 윈도우용 grep.exe를 직접 사용할 경우 (참고용)
# 환경변수에 Git Bash의 bin 경로가 등록된 상태여야 작동함
grep "target_word" ./logs/app.log
파워쉘 환경에서 Select-String 명령어를 사용할 때는 대소문자를 구분하지 않는 것이 기본값이며, 만약 대소문자를 엄격하게 구분하여 검색하고 싶다면 뒤에 -CaseSensitive 옵션을 추가로 붙여주면 된다.
기술 검증 및 현재 상태
운영 기록 기준, Select-String 명령어를 사용하여 윈도우 환경에서 아무런 외부 설치 없이 텍스트 로그 내의 특정 패턴을 완벽하게 검색해 내는 것을 검증하였다. 내부 테스트 기준으로도 대용량 로그 파일 수십 개를 대상으로 패턴 매칭을 수행했을 때, 리눅스 환경과 비교해도 손색없을 정도의 빠른 연산 속도와 안정성을 보여주었다.
현재 윈도우 환경에서의 텍스트 검색 에러는 Select-String 대체 코드 적용으로 완벽히 수리되어 정상 구동 중이다. 에이전트 프로그램의 자동화 스크립트 라인 내에서 오작동하던 파트가 윈도우 네이티브 명령어로 교체되면서, 더 이상 시스템 환경변수 누락으로 인한 프로세스 중단 현상은 발생하지 않고 있다.
같은 문제를 겪고 있는 개발자들을 위한 조언
윈도우 환경에서 텍스트 검색을 하실 때는 굳이 리눅스용 grep을 어렵게 설치하지 마시고, 파워쉘의 강력한 내장 명령어인 Select-String을 활용해 보시길 강력히 권장합니다. 환경변수를 꼬이게 만들 수 있는 외부 서드파티 바이너리를 추가하는 것보다, 운영체제가 기본적으로 제공하는 API와 셸 명령어를 활용하는 것이 장기적인 유지보수 관점에서 훨씬 현명한 선택입니다.
특히 개발 환경과 운영 환경이 달라 스크립트 호환성이 깨지는 문제를 막으려면, 윈도우 파워쉘 환경 전용 스크립트 구조를 명확히 분리하여 작성하는 버릇을 들이는 것이 좋습니다. 단축어인 sls만 기억하셔도 터미널에서의 작업 효율이 비약적으로 상승할 것입니다.