Media Log

/ 를 통해 쉽고 빠르게 원하는 문자열을 하이라이트 서치 할 수 있는 것만 해도 vim은 로그뷰어로서 꽤 쓸만하다.

많은 내용의 로그 파일을 읽을 때는 하이라이트 서치 외에도 보고 싶은 로그만 남도록 불필요한 부분들을 잘 쳐내는 것이 도움이 된다.

1. 특정 패턴이 존재하는 라인을 삭제
2. 특정 패턴이 존재하지 않는 라인을 삭제

불필요한 라인들을 쳐내기 위해서 위의 두가지 기능을 잘 이용할 수 있어야 한다.
물론 빔에서는 이것들을 아주 쉽게 해낼 수 있다.

그 내용을 설명하기 전에 먼저 패턴을 치환하는 방법을 살펴보자.

:%s/pattern/replace/g

위 명령어는 원하는 pattern을 replace로 전역 치환한다. 간단한 패턴이라면 머리 속에 잘 정리해서 한번에 위처럼 명령을 수행할 수 있겠지만, 조금 복잡하다면 먼저 패턴이 잘 매치되는지 부터 확인해보아야 할 것이다.
원하는대로 잘 매치가 되고 나면 이제 위에서 보이는 pattern 부분은 생략이 가능한데, 다음처럼 써서 이미 이전에 매치된 패턴을 치환시킬 수 있다.

:%s//replace/g
pattern 부분에 아무 것도 적지 않은 것을 주목해서 봐야한다. 빔은 저렇게 빈 패턴이 들어왔을 때 이전에 / 을 통해 마지막으로 매치시켰던 패턴을 기억하고 그 패턴을 대입해준다.

이제 처음 설명하기로 했던 2가지 기능을 알아보자.

특정 패턴이 존재하는 라인을 삭제
:g/pattern/d
위와 같은 간단한 입력을 통해서 특정 패턴이 존재하는 라인들을 삭제할 수 있다.
물론 위에서 설명한 것처럼 먼저 원하는 패턴을 한번 매치시켜놓고,
:g//d
라고 쓰는 것이 더 편리하다.
:g/pattern/p
위 명령은 특정 패턴이 존재하는 라인들만을 출력해준다.

특정 패턴이 존재하지 않는 라인을 삭제
위와는 반대로 특정 패턴이 존재하는 라인만을 남겨놓고 싶은 경우도 많이 생긴다.
:v/pattern/d
물론
:v//d
역시 가능하다.

v는 invert를 의미하며, 즉 :v//d는 선택되지 않은 패턴들을 삭제하겠다는 명령이 된다.

이 기능들을 얼마나 잘 사용하느냐는 정규표현식의 능숙도에 달려있다. 원하거나 원하지 않은 라인을 쳐내기 위해 해당 데이터를 잘 분석하고 정규식으로 매칭 시킬 수 있는 능력은 따로 연습해야 한다.
정규 표현식에 대해서는 따로 설명하지 않겠지만, 세상에서 가장 잘 쓰여진 정규식 책을 한 권 소개해 줄 수는 있다.


이 책은 이제는 아쉽게도 절판되었는데, 몇몇 사람들이 블로그를 통해 이 책을 팔아달라고 요청했지만 너무 아끼는 책이라서 나는 도저히 팔 수가 없었다.

빔 위키에 가면 유용하고 재미있는 팁들을 많이 배울 수 있다.
아래 처럼 vimrc에 적어주게 되면 F3 키를 한번 누름으로서 이전에 매치된 문자열이 포함된 라인들만 모아서 새창으로 자동으로 복사해준다.

nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>

지금 설명한 것들과 그 외의 많은 기법들을 neocoin 님에게 배울 수 있었다.
KLDP에서 vim에 대해 질문을 하면 항상 그가 답해주곤 했는데, 많은 것들을 가르쳐주어서 너무나 고맙게 생각한다.
그의 위키에는 vim에 대한 많은 재밌는 이야기들이 있으니 관심이 있다면 한번씩 읽어보길 추천한다.

관련글


신고
  1. Favicon of http://sunyzero.tistory.com BlogIcon 김선영 at 2010.07.10 04:08 신고 [edit/del]

    "v는 Vertical을 의미하는데 나는 왜 이렇게 이름 지었는지를 깨달을 수가 없어서 그냥 '반대' 라고 해석하고는 한다."
    -> UNIX계열에서 v는 verbose나 혹은 invert로 사용됩니다.(대문자는 주로 version으로) 따라서 vim에서는 invert로 사용되었다고 생각되네요. vertical은 생소한데...아마도 아닌듯 합니다.

    참고로 grep도 -v 옵션이 invert의 의미로 사용됩니다.

    Reply
  2. Favicon of http://www.petabytes.org BlogIcon 김재호 at 2010.07.10 17:52 신고 [edit/del]

    엇. 제가 착각했었네요. :vs로 창을 수직으로 나눌 때랑 완전히 햇갈렸나봅니다. 도움말에는 vglobal로 되어있는데 invert가 맞는 것 같네요.

    Reply

submit

vim은 내가 가장 좋아하는 에디터이다.
Windows에서나 Linux에서나 vim을 애용하곤 하는데, 거의 모든 텍스트 문서는 빔으로 열어보고 그 중의 대부분은 로그 파일이다.

오픈 소스들을 받아서 코드를 읽어볼 때도 vim을 사용하긴 하지만 vim에서 코드를 작성하지는 않기 때문에 거의 읽기 전용으로 사용하는 것이나 마찬가지이다. 빔의 쓰기 기능보다는 검색과 이동 그리고 치환 기능을 주로 사용하는데, 이것만으로도 나는 너무나 편리하다.

내가 가장 좋아하는 빔의 기능 중 하나는 *이다.
원하는 단어위에 커서를 올려놓고 *를 누르면 해당 단어들을 모두 하이라이팅 시켜주고 앞뒤로 쉽게 이동해 나갈 수 있다.

정말 편리하지만 이 기능에 한가지 불만이 있다면, 멀티 하이라이팅이 안된다는 것이다.
그래서 나는 word1\|word2 와 같이 직접 정규식의 alternation을 사용해서 멀티 하이라이팅을 시켜나가곤 했는데, 타이핑 하는 것이 꽤나 귀찮을뿐더러 색상도 다 똑같아서 보기에도 불편했다.

계속 그렇게 사용해오다가 아무래도 멍청한 짓을 하는 것 같아서 빔 위키를 한참 뒤져서 드디어 마음에 꼭 드는 플러그인을 찾았다.


설치 방법이나 사용방법은 해당 링크에서 확인하면 될 것이다.

3가지를 다 사용해봤는데 가장 마음에 드는 것은 Mark 이다.
Highlights는 gvim에서만 사용할 수 있어서 탈락.
MultipleSearch는 사용자 인터페이스가 Mark보다 지저분하다.


Mark는 단어뿐 아니라 패턴을 하이라이팅 시킬 수 있으며, 비주얼 모드로 선택한 단어들 역시 하이라이팅 시킬 수 있어서 편리하다.
물론 패턴들마다 다른 색상으로 하이라이팅되며 같은 패턴 내에서 이동시킬 수도 있고 선택된 모든 패턴간에 이동도 가능하다.

디바이스 드라이버 로그나 서버 로그 등을 읽을 때 몇몇 포인터들을 추적해 나가거나 쓰레드 별로 로그를 확인할 때에 똑같은 색상으로 하이라이팅 해놓고 눈알이 빠질 것만 같아서 너무나 불편했다.

개발자나 시스템 관리자라면 로그를 많이 읽어야 하고 또 잘 분석해야한다.
이런 기능들을 잘 사용하면 (꼬물 에디터를 쓰는)다른 사람들보다 쉽게 그리고 다른 사람들이 발견하지 못하는 문제들도 해결할 수 있을 것이다.

관련글
신고

submit