윈도 커맨드콘솔 – find의 재발견

제가 메일 서비스를 담당하는 관계로, 메일 서버의 로그나 관련 데이터를 뒤질 일이 적지 않습니다. 데이터량이 적으면야 대충 대충 어떻게든 하겠지만, 백만라인을 넘어간다던지, 데이터 파일의 크기가 50메가가 넘는다던지 하게 되면 그 안에 필요한 데이터만 뽑기가 완전 뭣같죠(…) Acroedit로 파일 나누고, 엑셀로 임포팅하면 한 3만년 걸리는 경우가 좀 있고, 대부분의 경우 그냥 시스템이 뻗어버립니다. -_-;

개발자는 아니지만 틈틈히 개발자분들 귀찮게 하다가 nix 환경에서 grep 커맨드가 있다는 사실을 알게 되었습니다. 그 큰 파일에서 필요한 텍스트가 있는 부분만 찾아내주는 아주 유용한 커맨드더군요. 혹여나 짧은 상식에 윈도에도 그런게 있나 싶어 Command Console을 열고 grep을 치니 아래와 같이 나오더군요.

당연히 그딴거 없다.


이런.. &(%^$%!@^%$^!%$@#!!!!! 나는 어쩌라고!!!! 제가 회사에서 MS Office 2007 Beta 2 버전을 쓰고 있는데, 제아무리 엑셀 2003까지의 라인제한이었던 65,536 라인의 몇배를 지원하는 Excel 2007 이라 하더라도 몇십만줄을 한번에 부르기도 불가능한 상황이고, 설혹 나눠서 부른다고 해도 컴퓨터가 중간에 뻗어버리는데 어찌하오리까. -_-;

그러다가 문득 아~주 옛날에 “파일검색”용인 줄 알았던 커맨드, find가 떠올랐습니다. 컴퓨터를 잘 모르던 시절이니 안된다고 투덜거리기만 했지요. 그래서 find 명령어를 쳐보니, 아니. 살아있는겁니다.

아직 안 죽고 살아있었..;


find /? 를 입력해서 스위치 및 매개 변수를 봤습니다.


nix 계열의 grep 커맨드와 비교했을 때 상당히 간단하고, 제한된 범위 내의 기능만을 제공하고 있습니다만, 적어도 제가 필요한 “특정 문자열을 가진 라인의 추출” 기능을 사용할 수 있으니 꽤 만족스럽네요.

find 문의 기본 구문은 [find “문자열” 파일이름] 입니다. 별다른 스위치를 달지 않고 저렇게만 입력하면 해당 파일에서 특정 문자열을 가진 라인을 화면으로 표시해줍니다. 이걸 파일로 표시하기 위해서는 “> 파일명”을 덧붙여주면 되는군요.

예를 들어, at.txt 파일에서 widelake 라는 문자열을 가진 파일을 pentium.txt로 저장하려면 아래와 같이 쓰면 됩니다.

C:\>find “widelake” at.txt > pentium.txt

스위치는 다음 것들이 있군요.

/V        지정한 문자열이 없는 줄을 표시합니다.
/C        지정한 문자열이 있는 줄 수만을 표시합니다.
/N        지정한 문자열이 있는 각 줄 앞에 줄 번호를 붙입니다.
/I        대/소문자를 구별하지 않고 찾습니다.
/OFF[LINE] 오프라인 속성 세트 파일을 건너뛰지 않습니다.

/V를 붙이게 되면 (c:\find /v “widelake” at.txt > pentium.txt) widelake 문자열을 포함하지 않는 라인만 pentium.txt 파일로 저장하게 됩니다. /V를 붙이면 안 붙인 것과 정 반대의 결과값이 나오는 거죠.

/C는 문자열을 포함하는 라인의 갯수만 출력해줍니다. 열 전체를 저장해주는게 아니구요.

/N은 저장할 때 해당 라인의 라인번호를 같이 붙여줍니다. /C 스위치하고 같이 쓸 수는 있는데 어차피 /C는 라인갯수만 세어주기 때문에 의미는 없습니다. 그리고 /I는 대소문자 구별을 해제하는 것인데, 영문 문자열을 찾을때만 해당되는 사항이군요. /OFFLINE 은 뭔지 모르겠습니다. -_-;


실제 써보도록 하겠습니다.

아래 내용을 가진 at.txt 파일이 있다고 가정하겠습니다.

widelake
widelake dreamwiz
gmail
widela skku
iriver

① find “widelake” at.txt

———- AT.TXT
widelake
widelake dreamwiz

② find /v “widelake” at.txt

———- AT.TXT
gmail
widela skku
iriver

③ find /c “widelake” at.txt

———- AT.TXT: 2

④ find /v /c “widelake” at.txt

———- AT.TXT: 3

⑤ find /n “widelake” at.txt

———- AT.TXT
[1]widelake
[2]widelake dreamwiz

⑥ find /v /n “widelake” at.txt

———- AT.TXT
[3]gmail
[4]widela skku
[5]iriver

뭐 이정도 결과값들을 뽑아줍니다. 상당히 괜찮은 커맨드이니 윈도만 사용하시면서 grep을 그리워(?)하는 분들은 부족하나마 써보시는 것도 괜찮을 듯 합니다. 😀 grep 하나 때문에 리눅스 라이브CD까지 쓴 저로써는 -_-; 흑흑.

6 댓글

  1. cygwin은 posix 에뮬레이션 레이어를 만들어 줍니다. 쉽게 말하자면 vmware에서 구동하는거라 보면 됩니다. vmware는 하드웨어를 에뮬레이션해주지만 cygwin은 유닉스 기능 일부를 에뮬레이션 해주지요. 그래서 cygwin은 항상 커다란 cygwin DLL을 끌고 다닙니다. (참고로 posix는 unix계열의 표준화 노력이며 linux도 지원합니다. posix 규약대로 작성한 프로그램은 현존하는 대부분의 unix계열 OS에서 컴파일되고 제대로 동작할것이라고 생각해도 됩니다.)
    넷을 찾아보면 win32로 포팅한 바이너리도 많이 있습니다. 실행파일 하나 달랑 들어있어 편하죠. 일일히 찾아다녀야 하는게 귀찮은 문제지만 보통 자주 사용하는것은 몇개로 한정되어 있으니 한번 찾아두면 두고두고 편합니다.

  2. 윈도우에서 지원하는 파일내 문자열 검색은 세가지 방법이 있는데

    find.exe (おっしゃったとおり)
    findstr.exe (정규식 검색 지원. 꽤나 강..력?)
    찾기에서 파일 내 검색 (많이 부정확. 놓치는 경우 多)

    단 findstr의 경우 유니코드를 지원하지 않으므로 나처럼 utf-8로 저장한 파일에서 검색하려다가 안되길래 찾아보고 절망하지는 마시고..

    그리고 Windows Services for UNIX (그전엔 SFU (Service for Unix) 라고 해서 나오던 것) 에 포함된 UNIX계 커맨드라인 유틸리티들도 있소 =ㅂ=.. 더 나가면 몇몇의 사람을 빼놓고 인생에 도움이 안되는 이야기라 여기서 스톱.

    1. 좋은 내용 ㄳ

      findstr은 포스팅하기전에 찾아냈었는데 그대 말대로 유니코드 지원 안하는거 때문에 개좌절 orz

      찾기 – 파일내 검색…..은 윈도 찾기 기능 자체를 안 쓰니 무시 -_-;

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.