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 파일에는 편집 명령만 넣고 저장·종료 명령은 넣지 마세요.
/opt/lab/data/app.log를/root/vimp/work.log로 복사하세요./api/pay가 들어간 줄이 몇 개인지 세어/root/vimp/count.txt에 숫자만 적으세요.- 상태코드가
500인 마지막 줄의 줄 번호를/root/vimp/last500.txt에 적으세요. - IP 의 마지막 옥텟을
xxx로 바꾸는 명령을/root/vimp/mask.ex에, 그 결과를/root/vimp/masked.log에 저장하세요. (10.1.2.3은10.1.2.xxx가 됩니다) ERROR가 없는 줄을 지우는 명령을/root/vimp/errors.ex에, 결과를/root/vimp/errors_only.log에 저장하세요.- 줄 끝이
200인 줄만 지우는 명령을/root/vimp/drop200.ex에, 결과를/root/vimp/no200.log에 저장하세요. - 두 번째 필드(날짜)를 지우는 명령을
/root/vimp/nodate.ex에, 결과를/root/vimp/nodate.log에 저장하세요. - 위 세 가지를 모두 적용하는 명령들을
/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 이 든 줄까지 사라집니다.
작업용 사본 만들기
/opt/lab/data/app.log 를 /root/vimp/work.log 로 복사하세요.
원본은 읽기 전용으로 두고 사본에서 작업하는 것이 기본입니다.
매치 개수만 세기
/api/pay 가 들어간 줄이 몇 개인지 세어 /root/vimp/count.txt 에 숫자만 적으세요.
치환 명령에 n 플래그를 붙이면 바꾸지 않고 개수만 알려 줍니다. 슬래시가 든 패턴은 이스케이프가 필요합니다.
마지막 500 응답 찾기
상태코드가 500 인 마지막 줄의 줄 번호를 /root/vimp/last500.txt 에 적으세요.
G 로 파일 끝으로 간 뒤 ? 로 역방향 검색합니다. 현재 줄 번호는 Ctrl-G 나 :set number 로 볼 수 있습니다.
IP 마스킹 치환
IP 의 마지막 옥텟을 xxx 로 바꾸는 명령을 /root/vimp/mask.ex 에, 그 결과를 /root/vimp/masked.log 에 저장하세요. (10.1.2.3 은 10.1.2.xxx 가 됩니다)
괄호로 살릴 부분을 묶고 후방참조로 되부릅니다. 마지막 옥텟만 바뀌어야 합니다.
ERROR 줄만 남기기
ERROR 가 없는 줄을 지우는 명령을 /root/vimp/errors.ex 에, 결과를 /root/vimp/errors_only.log 에 저장하세요.
:g 와 :v 는 반대입니다. 없는 줄을 지우는 쪽이 어느 것인지 생각해 보세요.
정상 응답 제거하기
줄 끝이 200 인 줄만 지우는 명령을 /root/vimp/drop200.ex 에, 결과를 /root/vimp/no200.log 에 저장하세요.
줄 끝 고정을 빠뜨리면 다른 필드에 든 200 까지 걸립니다.
날짜 컬럼 지우기
두 번째 필드(날짜)를 지우는 명령을 /root/vimp/nodate.ex 에, 결과를 /root/vimp/nodate.log 에 저장하세요.
앞의 두 필드를 묶어 잡고 첫 번째만 되살리면 두 번째가 사라집니다.
3단 변환을 한 스크립트로
위 세 가지를 모두 적용하는 명령들을 /root/vimp/report.ex 에 넣고, 결과를 /root/vimp/report.log 에 저장하세요. 최종 형태는 10.1.2.xxx GET /api/item 500 ERROR 입니다.
앞에서 만든 명령 세 개를 순서대로 넣으면 됩니다. 순서에 따라 결과가 달라질 수 있으니 확인하세요.