| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- disown
- pkill
- Tux
- nohup
- remove
- pwd
- bg
- du
- xargs
- 코드블럭
- 권한상승
- 상대경로
- printworkingdirectory
- Linux
- 심볼릭링크
- chown
- 커널패닉
- su
- 리눅스
- command
- sed
- 스트림에디터
- 턱스
- IT
- CodeBlock
- mkdir
- 텍스트
- 명령어
- 모니터링
- 하드링크
- Today
- Total
Snow flake
[command] vi, vim 기본 사용법 본문
지금까지 다룬 명령어들은 모두 터미널에서 한 줄로 실행하는 것들이었는데, 실제로 설정 파일을 열어서 내용을 직접 편집해야 하는 경우도 많습니다. GUI 환경이 없는 리눅스 서버에서는 거의 항상 vi 또는 vim이 기본으로 설치되어 있어서, 이 편집기 사용법은 서버 작업의 기본기라고 할 수 있습니다.
vi와 vim의 관계
vi는 오래된 유닉스 계열 표준 편집기이고, vim(Vi IMproved)은 vi를 개선한 버전입니다. 대부분의 최신 리눅스 배포판에서는 vi라고 입력해도 실제로는 vim이 실행되도록 설정되어 있습니다. 문법 강조, 실행 취소(undo) 등 vi보다 편의 기능이 많아서, 실무에서는 보통 vim을 쓴다고 봐도 됩니다.
모드 개념 이해하기
vi/vim을 처음 접했을 때 가장 헷갈리는 부분이 "모드" 개념입니다. 일반 편집기와 달리 vi는 상황에 따라 다른 모드로 동작합니다.
명령 모드(Normal/Command mode): 파일을 열면 기본으로 시작되는 모드. 이동, 삭제, 복사 등 명령을 입력하는 상태이며, 글자를 입력해도 바로 텍스트로 들어가지 않습니다
-- 입력 모드(Insert mode): 실제로 텍스트를 입력/수정할 수 있는 상태
-- 명령줄 모드(Command-line mode): :로 시작하며, 저장/종료/치환 등의 명령을 실행하는 상태
# 파일 열기
vi readme.txt
# 명령 모드에서 입력 모드로 전환
i # 현재 커서 위치에서 입력 시작
a # 커서 다음 위치에서 입력 시작
o # 현재 줄 아래에 새 줄을 만들고 입력 시작
# 입력 모드에서 명령 모드로 복귀
ESC
vi를 처음 쓸 때 가장 많이 하는 실수가, 파일을 열자마자 글자를 입력하려다가 화면이 이상하게 움직이는 경우입니다. 이는 아직 명령 모드인 상태에서 글자를 쳤기 때문에, 그 글자들이 각각 명령으로 해석돼서 생기는 현상입니다. 먼저 i를 눌러 입력 모드로 전환한 다음 텍스트를 입력해야 합니다.
저장하고 종료하기
# 명령줄 모드로 전환 후 아래 명령 입력 (ESC를 먼저 눌러 명령 모드로 돌아온 상태에서 : 입력)
:w # 저장만 (종료하지 않음)
:q # 종료 (변경사항 없을 때만 가능)
:wq # 저장 후 종료 (가장 많이 씀)
:q! # 저장하지 않고 강제 종료 (변경사항 버림)
:wq! # 강제로 저장 후 종료 (읽기 전용 파일 등에서 사용)
:wq는 실무에서 가장 자주 쓰는 조합입니다. 설정 파일을 수정하고 저장할 때 바로 이 명령을 씁니다. 반대로 실수로 뭔가를 잘못 건드렸을 때는 :q!로 변경사항을 버리고 나가면 안전합니다.
삭제, 복사, 붙여넣기 (명령 모드)
# 삭제 (delete)
x # 커서 위치의 글자 한 개 삭제
dd # 현재 줄 전체 삭제
5dd # 현재 줄부터 5줄 삭제
dw # 커서 위치부터 단어 하나 삭제
# 복사 (yank)
yy # 현재 줄 복사
5yy # 현재 줄부터 5줄 복사
# 붙여넣기 (put)
p # 커서 다음 줄(또는 위치)에 붙여넣기
P # 커서 이전 줄(또는 위치)에 붙여넣기
# 실행 취소/재실행
u # 실행 취소 (undo)
Ctrl + r # 재실행 (redo)
dd로 지운 줄이나 yy로 복사한 줄은 클립보드처럼 임시 저장되기 때문에, 바로 p를 누르면 그 내용이 붙여넣어집니다. 숫자를 명령 앞에 붙이면(5dd, 5yy) 해당 줄 수만큼 한 번에 처리할 수 있어서 여러 줄을 다룰 때 유용합니다.
검색과 치환
# 검색
/oracle # 아래 방향으로 "oracle" 검색
?oracle # 위 방향으로 "oracle" 검색
n # 다음 검색 결과로 이동
N # 이전 검색 결과로 이동
# 치환 (명령줄 모드에서 실행, sed와 문법이 유사함)
:s/old/new/ # 현재 줄에서 첫 번째로 매칭된 것만 치환
:s/old/new/g # 현재 줄 전체에서 매칭된 것 전부 치환
:%s/old/new/g # 파일 전체에서 매칭된 것 전부 치환
:%s/old/new/g는 파일 전체를 대상으로 특정 문자열을 한꺼번에 바꾸는 명령입니다. sed 글에서 다뤘던 sed -i 's/old/new/g'와 문법이 거의 비슷한데, 이는 vi/vim의 치환 문법이 sed에서 유래했기 때문입니다. 파일을 열어서 직접 눈으로 확인하며 치환할 때는 vi에서, 파일을 열지 않고 스크립트로 자동 처리할 때는 sed를 쓰는 식으로 구분하면 됩니다.
화면 이동과 줄 번호
# 커서 이동
gg # 파일 맨 처음 줄로 이동
G # 파일 맨 마지막 줄로 이동
숫자G # 해당 줄 번호로 이동 (예: 50G는 50번째 줄로 이동)
# 줄 번호 표시
:set number # 줄 번호 표시 켜기
:set nonumber # 줄 번호 표시 끄기
로그 파일이나 설정 파일에서 특정 줄을 지목해서 확인해야 할 때, :set number로 줄 번호를 켜두면 grep 글에서 다뤘던 grep -n 결과(라인 번호)와 대응해서 바로 찾아갈 수 있어 편리합니다.
실무에서 자주 마주치는 상황
설정 파일을 수정하는 일반적인 흐름은 다음과 같습니다.
# 1단계: 설정 파일 열기
vi /home/oracle/scripts/connect.conf
# 2단계: 특정 값 검색
/OLD_DB_HOST
# 3단계: 커서를 값 위치로 옮긴 후 입력 모드로 전환해서 수정
i # (또는 검색된 값을 지우고 새로 입력)
# 4단계: 수정 완료 후 명령 모드로 복귀
ESC
# 5단계: 저장하고 종료
:wq
# 6단계: 수정이 잘 됐는지 확인
cat /home/oracle/scripts/connect.conf
설정값 하나만 바꿀 때는 이렇게 vi로 직접 열어서 확인하며 수정하는 게 안전하고, 여러 서버의 같은 설정 파일을 일괄로 바꿔야 할 때는 sed 글에서 다뤘던 sed -i 방식이 더 효율적입니다. 상황에 맞게 두 방법을 구분해서 쓰는 게 실무에서 시간을 아끼는 방법입니다.
