본문 바로가기
IT Security/LINUX Basic

3. LINUX - VI 편집기 사용법

by Rosmary 2019. 8. 8.
728x90
반응형

지난 포스팅에서, 파일과 폴더를 만들고 삭제하는 방법을 알아보았다.

 

그러나, 내용이 없는 파일을 열심히 만들어봐야 의미가 없기 때문에, 이번 포스팅에서는 만들어진 파일에 내용을 추가하는 방법에 대해 이야기하려고 한다. 

 

윈도우에서 사용 가능한 문서 작성 프로그램은 메모장, 워드패드, 한글, 그리고 마이크로소프트 사에서 제공하는 워드 등등이 있다. 그리고 메모장과 워드패드의 경우, 윈도우가 10이든 7이든, 버전에 상관없이 기본적으로 제공되는 문서 작성 프로그램이다.

 

리눅스 역시 문서 작성에 사용할 수 있는 프로그램은 많다. 그리고 메모장과 같이, 모든 리눅스에서 제공하는 문서 작성 프로그램 중에는 vi editor(vi 편집기)라는 것이 있다. 이 편집기로 만든 파일을 이용해, 리눅스의 특정 명령어가 연속적으로 자동 실행되도록 만들 수도 있고(스크립트라고 한다), 혹은 메모 용도로도 사용할 수 있다. 컴퓨터를 조금 아시는 분이라면 vi가 윈도우의 메모장과 동일한 역할을 한다는 것을 어렴풋이 눈치채셨을듯 하다.

 

본격적으로 vi 편집기의 사용법에 대해 알아보자.

 

* 참고로 이번 주제는, 필자가 스크린 샷을 많이 찍을 수 없는 주제다.(절대 귀찮아서가 아니다...) 따라서, 독학을 위해 필자의 블로그를 참고하신 분들이라면, vi 편집기를 직접 많이 다루어보면서 작동 원리를 파악할 수 있기를 바란다.

 

 

1. vi 편집기 실행하기.

 

vi 편집기의 실행 명령어는 vi다. 명령창에 vi를 입력하면 아마 다음과 같은 화면으로 전환될 것이다.

 

*  그럴 일은 없을 것이라 생각하지만, 혹시라도 vi 명령어가 작동하지 않는 분들은, rpm -qa | grep vim 명령어의 결과가 화면에 나타나지 않을 가능성이 크다. 당황하지 말고, 아래의 명령어를 입력하자. 그리고 다시 vi를 실행해보자.

 

================================

yum install -y vim-common

yum install -y vim-filesystem

yum install -y vim-minimal

================================

 

 

위의 화면이 나타나면, 아마 특정 키보드를 누르지 않는 이상 글자 입력이 진행되지 않을 것이다. 이유는 vi가 3개의 편집모드를 가지고 있는데, vi를 실행한 첫 화면은 사용자가 글자를 입력할 수 없는 모드이기 때문이다. vi 편집기의 모드는 아래와 같다.

 

================================================================

명령모드:                커서 이동 및 단순 수정(한 줄 지우기, 문단 지우기 등)이 가능한 모드

편집모드(입력모드):  글자의 입력 및 수정이 가능한 모드

실행모드:               파일의 저장, 나가기, 특정 글자의 치환이나 검색이 가능한 모드

================================================================

 

처음 vi 편집기를 접하는 입장에서, 단순한 문서 작성 프로그램이 3 개의 모드를 가진다는 것에서 혼란스러운 기분을 느낄 수 밖에 없다. 좌절하지 말자. 우선, 가장 중요한 편집모드로의 변경과 내용 입력부터 알아보자.

 

* 처음 vi 편집기를 실행하면서, 동시에 파일명도 명시해주고 싶다면, "vi 파일명" 형태로 명령어를 입력하면 된다. 아래와 같은 형태로 말이다.

 

===================

[root@localhost] vi testfile

===================

 

 

2. 편집모드.

 

가장 첫 화면인 명령모드에서는 특정 키보드를 입력해야 글자 입력이 가능한 입력 모드로 전환된다고 위에서 언급했다. vi 편집기의 첫 화면에서 a, i 또는 o를 입력하면, 화면 왼쪽 하단에 recording이라는 하얀색 글씨 앞에, INSERT라는 문구가 추가되는 것을 볼 수 있다. 이 상태를 편집모드라고 하며, 이제 여러분들은 vi 편집기에 타이핑을 시작할 수 있다.

 

* a, i, o의 의미는 추후 명령모드에서 살펴본다.

 

왼쪽은 명령모드, 오른쪽은 편집모드 상태이다.

 

 아무 글자나 입력해보자. 입력이 완료되고 ESC 키를 누르면, 아마 첫 화면처럼 글자 입력이 되지 않을 것이다. 이처럼, 편집모드에서 ESC키를 누르면 다시 명령모드로 돌아오게 된다. 

 

 

3. 명령 모드

 

명령 모드는 간단한 편집 명령어나 문자 치환, 삭제 등의 기능을 지원한다. 워낙 많기 때문에 본 포스팅에서 전부 언급할 수는 없고, 가장 많이 사용하는 명령모드의 키에 대해서 알아보려 한다. 진행하기 전에, 모두 현재의 vi 편집기에 다음의 내용을 작성하고, 명령모드로 복귀하도록 하자.

 

=========================

Hello, World

My name is Linux

Nice to meet you

It's a wonderful world!!

=========================

 

 

 

(1) 커서의 이동

 

커서의 이동은 윈도우처럼 방향키를 사용하면 된다. 만약 안되는 분들이 있다면 고전적인 방법을 이용해야 한다. 마치 옛날 키보드 게임에서 화살표 대신 특정 키를 입력했던 것처럼 말이다. 리눅스에서는 키보드의 hjkl을 ←↓→로 인식한다.

이동해서 "hello," 바로 뒤에 커서를 위치시켜보자.

 

 

(2) i (insert) ,  a (append), o

 

커서가 위치한 곳에서 i를 눌러보자. 커서가 이동없이 원래 위치에서 입력모드로 바뀔 것이다.

다시 ESC로 명령모드 복귀 후, 커서를 원래의 자리로 이동 시킨 뒤, a를 눌러보자. 다시 입력모드로 바뀌긴 하지만, 커서의 위치는 원래 위치에서 한 칸 뒤로 이동한다.

 

이를 통해, i는 커서의 현재 위치에서 입력을 시작하고, a는 커서의 바로 뒤에서 입력을 시작한다는 것을 알 수 있다. 즉, 똑같이 명령 모드에서 입력모드로 전환하는 키지만, 커서의 현재 위치를 기준으로 어느 부분부터 입력을 진행할 것인지 결정한다고 보면 된다.

 

다시 명령모드로 돌아와(ESC키를 누른다), 이번에는 o를 눌러보자. 똑같이 입력모드로 전환이 되나, 이번에는 커서 밑에 빈 줄이 추가로 생성되면서 입력할 수 있게 된다. 즉, o키는 현재 커서가 위치한 바로 아랫줄에, 빈 줄을 형성하고 입력을 진행시킨다.

 

참고로, 명령모드에서 대문자 I, A, O를 작성하면 필자가 언급한 것과 다른 결과가 나타난다. 대문자 I는 현재 커서가 위치한 줄의 가장 앞에서, 대문자 A는 현재 커서가 위치한 줄의 가장 뒤에서, 그리고 대문자 O는 현재 커서가 위치한 줄의 바로 윗 단에 새 줄을 추가하여 입력을 진행한다.

 

* 필자는 아직까지도 명령모드의 o가 의미하는 단어가 무엇인지 모르겠다.

 

 

(3)  한 줄의 잘라내기, 또는 복사 (dd, yy, p)

 

두 번째 줄의 "My name is LINUX"로 이동한 뒤, dd를 명령모드에서 입력해보자. 원래 4줄이었던 문단이 3줄로 바뀌었고, 커서가 위치했던 "My name is LINUX"는 한 줄이 통째로 사라졌을 것이다. 당황하지 말고, 첫 번째 줄로 이동한 뒤, p를 입력해보자. 아마 사라졌던 "My name is LINUX"가 다시 나타났을 것이다.

 

오해하지 말아야 할 것이, p가 원래의 작업을 되돌리는 undo 기능이 아니라는 것이다. 이는 명령모드에서 p를 연달아 입력해보면 알 수 있겠지만, p는 붙여넣기 명령어이다. 

 

따라서 dd 이후, 바로 p를 누르는 행위는 "잘라내기 -> 붙여넣기"와 동일한 행위를 하는 것이라고 보면 된다.

 

그럼 이런 의문이 든다. 과연 복사를 할 때마다, 복사해야하는 행을 잘라내기 한 뒤, p를 두 번 쳐야 하는가? 아니다. 이러한 불편함은 yy라는 녀석이 해결해준다. 복사하고자 하는 열 위에 커서를 놓고 yy를 누른 뒤, p를 눌러보자. 바로 아래 행에 복사하고자 했던 줄이 나타난다. 

 

yy 이후, 바로 p를 누르면 "복사 -> 붙여넣기"와 동일한 결과를 나타낸다.

 

만약 현재 커서 위치에서 연달아 3줄을 지우거나 복사하고 싶다면 3dd(yy)를 누른 뒤, p를 누르면 된다. p 역시, 앞에 숫자를 사용하여 복사하려는 횟수를 명시할 수 있다. 예를 들어, 5줄 복사를 위해 5yy를 누르고, 9p를 누르면, 5 X9 = 45 줄이 원래 5줄 뒤에 새로 생성된다.

 

 

 

(4) u (undo), Ctrl + r (redo)

 

지금까지의 명령모드 키로 이런 저런 실험을 해 보셨다면, 아마 현재 보고 있는 vi 편집기의 화면은, 처음 작성했던 4줄짜리 파일이 아닐 것이다. 이제 이를 처음 상태로 되돌려보자. 명령모드에서 u 키는 윈도우의 Ctrl + z와 동일한 역할을 한다. 파일이 최종 저장되었던 상태까지 작업 내용을 되돌린다. 따라서, 현재의 화면에서 u 키를 무한히 누르게 되면, 최종적으로 보이는 화면은 아무것도 없는 텅 빈 화면일 것이다. u를 눌러서 가장 맨 처음 작성한 4줄짜리 문서로 돌려놓자.

 

만약 처음 작성한 4줄 짜리 문서에서 u를 몇 번 더 눌렀다면(...조심 좀 하지!!), Ctrl + r 키로 다시 원상 복구 할 수 있다.

 

 

 

(5) 용량이 큰 파일 내에서 커서를 쉽게 이동하기

 

yy와 p를 이용해, 200줄 정도의 파일로 편집해보자.(응용이 잘 되시는 분들이라면 금방 진행할 것이다)

 

다 만들어졌다면, 커서의 위치를 가장 마지막 줄로 옮겨보자. 200 줄의 마지막까지 옮기는 데에 시간이 한참 걸릴 것이다. 이 때, 숫자 + gg g 를 명령모드에서 입력하면, 해당 숫자의 행으로 커서가 옮겨지게 된다. 숫자를 제외하고 단순히 gg만 입력하면, 커서는 파일의 가장 첫 줄로 돌아간다. 

 

마지막 줄로는 어떻게 이동할까? 파일의 마지막이 몇 번째 행인지 알 수 없다면, 대문자 G를 눌러보자. 한 번에 파일의 가장 마지막 줄로 커서가 이동하게 된다.

 

 

(6) r (replace), x

 

만약 여러분들이, 어떤 파일을 작성하면서, 한 글자가 잘못 입력되었다고 가정해보자. 이 하나의 글자를 수정하기 위해, 편집모드를 들어갔다가 다시 ESC를 누르는 과정이 번거로울 수 있다(처음 vi를 다룰 때는 "이게 뭔 대수라고..." 싶을 것이다. 필자도 그랬다).

 

applw(apple의 오타다)이라는 단어를 입력모드로 작성하고 다시 명령모드로 빠져나와보자.

 

오탈자인 w 위에 커서를 둔 채, r를 눌러보자. 아마 큰 변화가 없을 것이다. 그러나 r를 누른 후, 원래 철자인 e를 입력하면, w가 e로 바뀐다. 그 후에는 a, i, o를 누르지 않는 이상, 어떤 키를 누르더라도 입력이 되지 않는다. 

 

정리하자면, 명령모드의 r키는 하나의 글자를 수정하기 위해 입력모드와 명령모드를 드나드는 수고로움을 덜어주는 키라고 보면 된다. 

 

만약 한 글자가 추가로 잘못 입력되었다면 어떻게 해야할까? 이 때는 해당 글자 위에 커서를 둔 채, x를 눌러주면 편집모드로의 전환 없이 해당 글자의 삭제가 가능하다.

 

 

 

이외에도, 명령 모드에서 사용할 수 있는 키는 여러가지가 있지만, 자주 사용하지 않는 것이라 언급하지 않고 넘어가려한다. 이제 vi 편집기의 마지막 모드인 실행 모드에 대해서 알아보자.

 

 

 

 

4. 실행모드

 

실행 모드는 윈도우의 문서 편집 프로그램의 메뉴에서 제공하는 기능들을 생각하면 되겠다. 예를 들면 저장, 불러오기나, 찾기, 단어 변경 등등등 말이다.

 

명령모드에서 콜론(:)을 입력하면 실행 모드가 실행된다. 좌측 하단에 콜론(:) 기호가 나타난다면, vi 편집기가 현재 실행 모드로 동작 중임을 알 수 있다. 

 

실행 모드에서 글자를 입력하면, 좌측 하단의 콜론 뒤로 글자가 입력된다. 즉, 여기에 특정 단어나 글자를 입력하면, 파일이 저장되고, 단어를 찾고, 단어를 변경하는 작업이 가능하다는 말이다. 하나씩 살펴보자.

 

 

(1) 문서의 저장

 

실행 모드 상태에서 w + 파일명을 입력한 뒤, 엔터를 쳐 보자. 그럼, 콜론이 위치했던 좌측 하단은 여러분들이 입력한 파일명이 나타나게 될 것이다.

 

위의 사진에서 파일은 이미 Greeting이라는 이름으로 저장되어 있지만, 다른 이름을 이용해서도 저장이 가능하다. 동일한 파일에 w INSA 라는 명령어를 입력하면, 다음과 같이 INSA라는 이름의 파일이 다시 저장되게 된다.

 

Greeting과 INSA라는 파일은 동일한 하나의 파일이 아니라, 별개의 파일로 컴퓨터가 인식한다. 워드에 빗대어 말하자면, 하나의 파일을 다른 이름으로 저장하는 것과 동일한 작업을 진행했다고 보면 된다. 만약 파일명을 제외한 채, w만 실행 모드에서 입력하게 된다면, 파일은 가장 처음 지정했던 파일 명으로 저장된다. 

 

 

 

(2) 단어 찾기

 

실행 모드에서는 파일 내에 존재하는 단어도 찾는 것이 가능하다. 가장 첫 줄에 커서를 위치시킨 뒤, 실행 모드로 진입해보자. 그리고 실행 모드의 콜론 뒤에 슬래시(/)를 입력하고 연달아 찾고자 하는 단어를 입력해보자.

 

 

입력하고 엔터를 치면, 현재 커서가 위치한 행에서 아랫방향으로 이동하면서 단어가 위치한 행의 가장 앞에 커서가 놓이게 된다.

 

그럼, 현재 커서의 위치보다 윗 줄에 위치하고 있는 단어는 어떻게 찾을까? 단순히 슬래시(/)를 물음표(?)로 바꾸고 실행하면 문제가 해결된다.

 

 

(3) 문자의 치환

 

이번에는 두 번째 줄의 LINUX를 WINDOW로 바꿔보려고 한다. 실행 모드에서 1,$s/LINUX/WINDOW/를 입력해보자.

 

실행 모드에서 입력한 문장은 다음과 같은 의미를 가진다.

 

==========================================

1,$           -> 1행부터 끝행까지(첫 행은 ^로 표시하기도 한다)

s             -> 단어를 치환(switch)할 것이다.

/LINUX/    -> LINUX라는 단어가 보이면,

WINDOW/ -> WINDOW로 바꿔라.

===========================================

 

다만, 이 명령어는 1행부터 쭈욱 스캔을 진행하다가 LINUX라는 단어가 처음 나타나는 그 순간에만 WINDOW로 바꾸고, 그 뒤에는 해당 명령어를 실행하지 않는다는 단점이 있다. 만약, 위의 문단에서, world를 Daisy로 모두 바꾸고 싶다면 어떻게 해야할까? 모든 world가 daisy로 바뀔 때까지 일일이 1,$s/world/daisy/를 입력하는 것은 비효율적이다.

 

1,$s/world/daisy/g   로 명령어를 입력해보자.

 

g(group)를 명령어 마지막에 추가함으로써, 첫 행부터 마지막 행까지 모든 world가 daisy로 바뀐 것을 확인할 수 있다. 

 

이 명령어를 사용하면서 주의해야 할 점은 딱 하나다. 치환 명령어를 입력하면서 행 범위를 명시하지 않는다면, 치환은 커서가 위치한 행에서만 진행이 된다는 것.

 

 

(4) 행 번호의 출력

 

명령모드에서 파일의 행 개수를 할 수 있는 한, 무한히 만들어보자. 그리고, 위의 치환 명령어를 사용해 전체 줄의 1/3 만 치환을 진행해보도록 하자....아마 현재로써는 불가능할 것이다. 마지막 행이 몇 행인지만 알아낸다면, 큰 문제가 되지 않지만, 무절제하게 행을 늘린 까닭에 일일이 줄 수를 세어봐야하는 상황에 놓였다. 

 

이 때 사용할 수 있는 실행모드의 명령어가 set number라는 명령어다. 실행모드에서 set number를 입력해보자.

 

간단히 set nu 라고 입력해도 나온다. 

 

이전과 달리, 각 행의 맨 앞에 행 수가 출력이 되면서, 마지막 행이 몇 번째 줄에 위치해 있는지도 쉽게 파악이 가능하다. 이제 여러분들은 끝도 모르고 늘어난 행의 갯수를 세느라 고생하지 않아도 된다. 

 

 

(2) 다른 파일의 내용을 현재 파일 아래에 붙여넣기

 

가끔, 다른 파일의 내용을 현재 파일에 붙여넣기 해야할 경우가 생긴다. 윈도우의 경우, 마우스라는 훌륭한 도구가 있기 때문에 이 문제를 쉽게 해결할 수 있지만, 태생이 마우스 사용과는 거리가 먼 리눅스의 경우... 어쩔 수 없이 명령어로 해결해야 한다. 

 

실행모드에서 방금 만든 INSA 파일의 내용을 현재 커서 밑에 붙여넣기 해보겠다.  r INSA 라는 명령어를 쳐 보자.

 

INSA파일에는, daisy와 WINDOW로 바뀌기 전의 단어인 world와 LINUX가 존재한다.

 

(3) 잠깐 vi 편집기 벗어나기

 

실행 모드에서 sh 를 입력하면, 잠깐 vi 편집기를 벗어나, 쉘 환경(리눅스 명령어를 사용하는 공간)으로 이동할 수 있다. 다시 원래 문서를 편집하러 가기 위해서는 Ctrl + d를 누르면 된다. 이 두 명령어는 마치 윈도우 창의 우측 하단에 위치한 최소화 버튼(:sh)과 작업표시줄(Ctrl + d) 역할을 한다고 생각하면 된다.

 

 

(4) vi 편집기 나가기

 

실행모드에서 q(quit)을 입력하면, 현재의 vi 문서를 종료할 수 있다. 단, 전재 조건이 있는데, 현재 작업 중인 파일이 저장된 상태여야 나갈 수 있다는 것이다. 만약 저장 없이 나가려면 강제로 종료한다는 의미로 q 뒤에 느낌표(!)를 붙여 실행모드에서 입력하면 된다.

 

저장 없이 q로 편집기를 종료할 때, 나타나는 경고 문구다. 

따라서 q 명령어는 w와 함께 자주 사용되며, 실행모드에서 wq를 입력하면 저장 및 종료를 의미하게 된다. 주의해야 할 점은 wq 의 순서가 뒤바뀌면 안된다. qw는 종료 후, 저장을 한다는 의미이니 컴퓨터가 빨간 딱지를 보이며 짜증을 팍팍 낼 것이다. 

 

올바른 명령어가 아닙니다. 친구!!

 

실행 모드에서 자주 사용하는 명령어는 이게 전부다. 물론 vi 편집기에서 지원하는 기능이 필자가 소개한 것 보다 몇 배는 더 많지만, 이 많은 것을 기억해가며 이용할 사용자는 없거니와, 필자가 소개한 내용만으로도 충분히 vi 편집기 사용이 가능하기 때문에, 여기서 글을 마무리하려 한다. 

 

 

 

vi 편집기 명령어 정리
명령모드
h, j, k, l 커서 이동 화살표.   ←↓
a append. 커서의 현재 위치 바로 뒤에서 편집 시작
A 커서가 위치한 행의 가장 앞에서 편집 시작
i insert. 커서의 현재 위치에서 편집 시작
I 커서가 위치한 행의 가장 뒤에서 편집 시작
o 커서의 현재 위치 바로 아래에 새 행 추가 및 편집 시작
O 커서의 현재 위치 바로 위에 새 행 추가 및 편집 시작
[숫자] + dd [숫자] 행 잘라내기
[숫자] + yy [숫자] 행 복사하기
[숫자] + p 붙여넣기 [숫자만큼 반복]
[숫자] + gg [숫자]행으로 이동
gg 첫 행으로 이동
G 마지막 행으로 이동
u undo. 작업 취소
Ctrl + r redo. 작업 취소의 취소
r replace. 커서가 위치한 글자의 치환
x 커서가 위치한 글자의 삭제
실행 모드
w + [!] [파일명]  [깅제] [파일명으로] 저장
q + [!] [강제] vi 편집기 종료
[#line1],[#line2] s/word1/word2/[g] [행1에서 행2까지] word1을 word2로 [모두] 치환
r + 파일명 "파일명"의 내용을 현재 커서 아랫줄에 붙여넣기
sh, Ctrl +d vi 편집기 종료 없이, 쉘 환경으로 이동 / 복귀

 

반응형

댓글