vim 과 tmux · vim 실전: 검색·치환·매크로 · 실습
vim 검색과 치환
목표
vim 안에서 로그 파일을 필터링하고 치환하는 작업을 ex 명령으로 수행하고, 그 명령을 파일로 남겨 재현 가능하게 만듭니다. 재료는 /opt/lab/data/app.log (480줄, IP 날짜 메서드 경로 상태코드 [ERROR] 형식)입니다.
왜 중요한가
ex 명령은 전부 범위 + 동작 구조입니다. :%s/.../.../g, :5,20s/..., :'<,'>s/... 는 같은 규칙의 세 사례입니다. 여기에 줄 필터 :g(패턴에 맞는 줄)와 :v(맞지 않는 줄)가 더해지면 로그 가공의 대부분이 끝납니다. 특히 조심할 것은 g 플래그를 빼면 줄마다 첫 매치만 바뀐다는 점과 :g 와 :v 가 정확히 반대라는 점입니다. 이 둘이 조용히 잘못된 결과를 만드는 대표적인 원인입니다.
단계
/root/vimp 디렉터리에서 작업합니다. .ex 파일에는 편집 명령만 넣고 저장·종료 명령은 넣지 마세요.
1. /opt/lab/data/app.log 를 /root/vimp/work.log 로 복사하세요.
2. /api/pay 가 들어간 줄이 몇 개인지 세어 /root/vimp/count.txt 에 숫자만 적으세요.
3. 상태코드가 500 인 마지막 줄의 줄 번호를 /root/vimp/last500.txt 에 적으세요.
4. IP 의 마지막 옥텟을 xxx 로 바꾸는 명령을 /root/vimp/mask.ex 에, 그 결과를 /root/vimp/masked.log 에 저장하세요. (10.1.2.3 은 10.1.2.xxx 가 됩니다)
5. ERROR 가 없는 줄을 지우는 명령을 /root/vimp/errors.ex 에, 결과를 /root/vimp/errors_only.log 에 저장하세요.
6. 줄 끝이 200 인 줄만 지우는 명령을 /root/vimp/drop200.ex 에, 결과를 /root/vimp/no200.log 에 저장하세요.
7. 두 번째 필드(날짜)를 지우는 명령을 /root/vimp/nodate.ex 에, 결과를 /root/vimp/nodate.log 에 저장하세요.
8. 위 세 가지를 모두 적용하는 명령들을 /root/vimp/report.ex 에 넣고, 결과를 /root/vimp/report.log 에 저장하세요. 최종 형태는 10.1.2.xxx GET /api/item 500 ERROR 입니다.
참고
:%s/패턴//gn은 아무것도 바꾸지 않고 매치 개수만 알려 줍니다. 치환 전 사정거리 확인용입니다.- 후방참조는 괄호로 묶은 부분을 되부르는 문법이고, 매치 전체는
&입니다. - 채점기는
.ex파일을 원본 사본에 다시 적용해 결과 파일과 일치하는지 확인합니다. - 흔한 실수 1: 5번에서
:g를 쓰면 정반대 결과가 나옵니다. - 흔한 실수 2: 6번에서
:g/200/d처럼 쓰면 IP 나 다른 필드에 200 이 든 줄까지 사라집니다.
단계 8개
- 작업용 사본 만들기
- 매치 개수만 세기
- 마지막 500 응답 찾기
- IP 마스킹 치환
- ERROR 줄만 남기기
- 정상 응답 제거하기
- 날짜 컬럼 지우기
- 3단 변환을 한 스크립트로