본문 바로가기

IT/소프트웨어

윈도 커맨드콘솔 - 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을 그리워(?)하는 분들은 부족하나마 써보시는 것도 괜찮을 듯 합니다. :D grep 하나 때문에 리눅스 라이브CD까지 쓴 저로써는 -_-; 흑흑.