LabHub
배우기 러닝패스 코스

vim and tmux

vim Search and Substitute

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

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.310.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 입니다.

참고

작업용 사본 만들기

/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.310.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 입니다.

앞에서 만든 명령 세 개를 순서대로 넣으면 됩니다. 순서에 따라 결과가 달라질 수 있으니 확인하세요.