서버/Linux I 2015. 12. 23. 20:15

Linux I - 08. vi 편집기 사용 방법

 

 

 

[root@CentOS ~]# echo $PS1
[\u@\h \W]\$


[root@CentOS ~]# PS1="[\u@\h \$PWD]# "
[root@CentOS /root]# cd ..
[root@CentOS /]# mkdir test
[root@CentOS /]# cd test
[root@CentOS /test]#

 

 

vi 편집기는 유닉스 계열에서 가장 많이 사용되고 있는 편집기이다.

 

 - 명령 모드 : vi 편집기 기본 모드, 입력을 명령어로 처리함

 - 입력 모드 : i, I, a, A, o, O 를 입력하면 텍스트 입력이 가능한 모드, 입력을 파일에 입력함

 - 확장 모드 : 왼쪽 하단에서 명령어를 수행하는 모드

 

 

 

 

1. vi 편집기 (오리지널 vi 편집기, root 계정은 기본적으로 이것을 사용함)

 

[root@CentOS /test]# ls -l /bin/vi  
-rwxr-xr-x. 1 root root 770248 2012-04-05 18:18 /bin/vi

 

[root@CentOS /test]# whereis vi

vi: /bin/vi /usr/share/man/man1/vi.1.gz /usr/share/man/man1p/vi.1p.gz


[root@CentOS /test]# alias vi
-bash: alias: vi: not found

 


 

2. vim 편집기 (업그레이드판 vi 편집기, 방향키 사용 가능, 다른 계정은 이것을 사용함)


[root@CentOS /test]#  ls -l /usr/bin/vim  
-rwxr-xr-x. 1 root root 1967072 2012-04-05 18:18 /usr/bin/vim

 

[root@CentOS /test]# whereis vim
vim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz

[root@CentOS /test]# su - user1
[user1@CentOS ~]$ alias vi
alias vi='vim'


[user1@CentOS ~]$ exit
[root@CentOS /test]#

 

 

 [vi 명령어 형식]

 vi

 새 파일을 편집할 수 있다. 작업이 완료되었다면 이름을 지정하여 저장해야 한다. 

 vi 파일이름

 파일이름을 가진 파일이 있는 경우, 해당 파일을 편집한다.

 만약, 없다면 새 파일을 편 집할 수 있는 상태로 시작한다. 

 vi -R 파일이름

 파일을 읽기 전용으로 오픈한다.

 vi -r 파일이름

 이전 편집 파일을 복구시킨다. 

 vi -L

 편집 파일이 비정상적으로 종료됬을 경우, 복구할 이전 파일 전체 목록을 확인할 수 있다.

 vi +13파일이름

 파일의 13번째 라인부터 오픈한다. 

 vi -c 13 파일이름

 파일의 13번째 라인부터 오픈한다.

  vi +/"abcd" 파일이름

 'abcd' 단어가 들어간 라인부터 오픈한다.

 

 

[root@CentOS /test]# alias vi="vim"

[root@CentOS /test]# vi test

 

i -> Hell Test 입력 -> ESC -> : -> wq! 엔터

Hello Test

 


 

 

 

 

 

 


:wq!

 

 

[root@CentOS /test]# cat test
Hello Test


 

[vi 편집기 자주 사용하는 키 모음]

 커서 이동

 명령어 삽입

 h

  왼쪽

 a

  커서 오른쪽 문자삽입

 l

  오른쪽

 A

  커서 오른쪽, 행 끝에 문자 삽입

 k

  위

 i

  커서 왼쪽 문자삽입

 j

  아래

 I

  커서 왼쪽, 행 처음에 문자 삽입

 $

 행 맨 뒤으로 이동

 o

 커서 아래 행 삽입

 0

 행 맨 앞으로 이동

 O

 커서 위에 행 삽입

 w

  한단어 오른쪽

 ESC

  명령어 삽입 키 사용 시작

 b

  한단어 왼쪽

 

 

 Return

  한행 아래

 

 

 Backspace

  한문자 왼쪽

 텍스트 삭제

 Spacebar

  한문자 오른쪽

x, 3x

글자 삭제, 3글자 삭제

 H

  화면 맨 위

dw, 3dw

단어 삭제, 3단어 삭제

 M

  화면 중간

dd, 3dd

행 삭제, 3행 삭제

 L

  화면 맨 아래

D

커서 오른쪽 행 삭제

 ^F

  한화면 앞

:1,2 d

1~2번째 라인 삭제

 ^D

  반화면 앞

 행 번호 출력

 ^B

  한화면 뒤

: set nu

라인 번호 출력 O

 ^U

  반화면 뒤

: set nonu

라인 번호 출력 X

 

 

텍스트 복사 및 이동

파일 저장 및 종료 

yy, 3yy

행 복사, 3행 복사

:w

저장

Y

행 복사

:w 파일이름

파일 이름으로 저장

p

복사된 행을 현재 행 위에 삽입

:wq

변경사항 저장하고 vi 종료

P

복사된 행을 현재 행 아래 삽입

:q!

변셩 사항 저장 않하고 vi 종료

:1,2 c 10

1~2행을 10행 다음으로 복사

 

 

:3,5 m 12 

3~6행을 11행 다음으로 이동

 

 

 행 찾기

 

 

G

파일의 마지막 행 이동

 

 

4G

4번째 행 이동 (= :4)

 

 

 

 

[참고] 글자 검색

 

명령어

내용

/찾을 내용

커서 아래로 원하는 내용 검색

?/찾을 내용

커서 위로 원하는 내용 검색

n

다음 위치 검색

N

이전 위치 검색

 

 

[root@CentOS /test]# cp /etc/group g.txt
[root@CentOS /test]# cp /etc/services s.txt
[root@CentOS /test]# ls
g.txt  s.txt  test

 

 

Ex1) 커서 이동 및 라인 번호 설정

 

[user1 /tmp/edit]$ vi s.txt

 

:set nu
:set nonu

:set nu


h - 좌
l - 우
j - 아래
k - 위


0 - 라인 맨 앞으로
$ - 라인 맨 끝으로


Ctrl+f - 다음 페이지
Ctrl+b - 이전 페이지


G - 맨 마지막 라인 이동
gg -
맨 첫번째 라인 이동
nG - n
번째 라인 이동


 

:q

 


 

 

Ex2) 문자 입력

 

[root@CentOS /test]# vi g.txt

 

:set nu

 

 

i - 커서 앞에서부터 입력
a - 커서 뒤에서부터 입력 ("l + i")
A - 라인 맨 뒤에서부터 입력 ("$ + a")
I - 라인 맨 앞에서부터 입력 ("0 + i")

o - 커서 아래쪽에 빈줄 생성 및 입력
O - 커서 위쪽에 빈줄 생성 및 입력

 

u - 취소 기능

Ctrl + r - 'u'로 취소한 내용을 다시 취소

 

 

:q!

 

 

 

Ex3) 문자 복사 & 붙여넣기

 

[root@CentOS /test]# vi g.txt


x - 지우기
nx - 커서 뒤쪽 n글자 삭제

dd - 현재 커서에서 라인 삭제
ndd - 현재 커서에서 n번째 라인까지 삭제
dw - 커서 단어 삭제
d$ - 커서 라인 삭제 및 라인 유지
dG - 커서 라인 포함해서 끝 라인까지 삭제

yy - 라인 복사
p - 커서 아래쪽 붙여넣기
P - 커서 위로 붙여넣기

nyy - n번째 라인까지 복사
3p - 커서 아래쪽 3번 붙여넣기


:13,21 co 37  <- 13~21라인을 37번째 아래에 복사&붙여넣기

 

 

:q!

 

 

 

Ex4) 치환 및 기타 명령어

 

[root@CentOS /test]# vi g.txt

 

cc - 삭제 후 바로 입력 가능 (치환 명령어)

J - 현 위치에서 아래 라인 올리기

. - 방금 전에 했던 명령어 및 입력 내용을 실행해줌

 

 

 

Ex5) vi 편집기 화면 정리 기능

 

[root@CentOS /test]# vi g.txt

 

Ctrl + l - vi 편집기 화면 정리 해줌

 

 

 - Putty를 이용하여 root 계정으로 또 로그인 실시

 

login as: root
root@192.168.1.2's password:
Last login: Wed Jan 20 10:18:25 2016 from 192.168.1.1

 

[root@CentOS ~]# shutdown -h +50

Broadcast message from root@CentOS
        (/dev/pts/1) at 11:23 ...

The system is going down for halt in 50 minutes!

 

 - 기존 root 계정 Putty에서 vi 편집기 화면에 'shutdown' 관련 메세지 출력 확인 -> Ctrl + l 실시 -> 화면 정리 확인

 

:q!

 

 - 새로 접속한 root 계정에서는 Ctrl + c를 이용하여 shutdown 실행 취소 실시

 

 

 

Ex6) 확장 모드 명령어 I

 

[root@CentOS /test]# vi g.txt

 

: ! - 쉘 명령어 실행 가능
: ! bash - 잠시 나가기 (Ctrl+z 동일, 다시 들어갈땐 fg 실시)

 

:!ls -d

 

[root@CentOS /test]# vi g.txt

 

합계 636
-rw-r--r--. 1 root root    804 2016-01-20 10:59 g.txt
-rw-r--r--. 1 root root 641020 2016-01-20 10:59 s.txt
-rw-r--r--. 1 root root     11 2016-01-20 10:21 test

Press ENTER or type command to continue

 

:!bash


[root@CentOS test]# ps
  PID TTY          TIME CMD
 2602 pts/0    00:00:00 bash
23175 pts/0    00:00:00 vi
23180 pts/0    00:00:00 bash
23190 pts/0    00:00:00 ps


[root@CentOS test]# exit

 

: / <- 위에서 아래로 검색
: ? <- 아래에서 위로 검색

n - 검색 정방향 이동
N - 검석 역방향 이동

:noh - 검색된 내용에 색깔 표시를 초기화하는 기능

 

: 1,3s/daemon/DAEMON - 1~3라인의 daemon를 DAEMON로 변경
: 1,$s/daemon/DAEMON- 1~끝라인의 daemon를 DAEMON로 변경
: %s/daemon/DAEMON - 1~끝라인의 daemon를 DAEMON로 변경
: %s/daemon/DAEMON/g - 1~끝라인의 daemon를 DAEMON로 변경

(g : 같은 라인에 daemon가 2개 이상 있으면 한개만 변경됨. g를 이용하면 다 변경됨)

 

:q!

 

 

 

Ex7) 확장 모드 명령어 II

 

[root@CentOS /test]# vi test.c

 

 /* test c program */
// this is a comment too.
#include <stdio.h>

int main()
{
        puts("Hello CCNA");
        puts("Hello CCNP");
        return 0;
}


: set bg=dark
: set bg=light
: set nu
: set ts=4
: set title
: set vb : 잘못 사용할 경우 비프음 대신 깜빡깜빡

 

:wq!

 

[root@CentOS /test]# vi test.c

 

 - 다시 실행하면, 기존 set 내용 초기화됨, 그렇기 때문에 다음과 같이 set 내용을 '.vimrc'에 설정을 저장함

 - 이 구성은 user1, user2 계정에도 동일하게 구성한다.

 

 

[root@CentOS /test]# cd
[root@CentOS /root]# vi .vimrc

 

set nu
set ts=4
set title
set vb

colo delek   // SecureCRT를 사용할 경우, 설정함

syntax on    // SecureCRT를 사용할 경우, 설정함

 

:wq!

 

 

 

[root@CentOS /root]# cat .vimrc
set nu
set ts=4
set title
set vb

colo delek   

syntax on    

 

 

[root@CentOS /root]# cd /test
[root@CentOS /test]# vi test.c

 

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");
       return 0;
10 }

:q!

 

 


Ex8) root 계정에서 로그인할때, 'alias' 설정 없이 'vim'으로 사용하는 설정 및 PS1 변수 자동 설정

 

[root@CentOS /root]# cd /test
[root@CentOS /test]# cd

[root@CentOS /root]# ls .bash*
.bash_history  .bash_logout  .bash_profile  .bashrc

 

 

[root@CentOS /root]# vi .bashrc

 

  1 # .bashrc
  2
  3 # User specific aliases and functions
  4
  5 alias rm='rm -i'
  6 alias cp='cp -i'
  7 alias mv='mv -i'
  8 alias vi='vim'
  9
 10 # Source global definitions
 11 if [ -f /etc/bashrc ]; then
 12     . /etc/bashrc
 13 fi
 14 PS1="[\u@\h \$PWD]# "
 15 export PS1
 

:wq!

 

[root@CentOS /root]# source .bashrc

 

 

Ex9) user1 계정에서 로그인할때, PS1 변수 자동 설정 (user2에서 동일하게 구성 실시)

 

[root@CentOS /root]# su - user1
[user1@CentOS ~]$ pwd
/home/user1

[user1@CentOS ~]$ ls .bash*
.bash_history  .bash_logout  .bash_profile  .bashrc

[user1@CentOS ~]$ vi .bashrc

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
PS1="[\u@\h \$PWD]$ "
export PS1

# User specific aliases and functions
 

:wq!

 

[user1@CentOS ~]$ source .bashrc
[user1@CentOS /home/user1]$ exit
logout


[root@CentOS /root]#

[root@CentOS /root]# cd ..
[root@CentOS /]# rm -rf test

 

 

Ex10) 두개 이상 계정이 동일한 파일을 vi 편집기로 오픈할 경우, 주의 사항

 

login as: user1
user1@192.168.1.2's password:
Last login: Wed Jan 20 13:19:37 2016 from 192.168.1.1
[user1@CentOS /home/user1]$
[user1@CentOS /home/user1]$ cd /tmp
[user1@CentOS /tmp]$ mkdir test
[user1@CentOS /tmp]$ cd test
[user1@CentOS /tmp/test]$

[user1@CentOS /tmp/test]$ vi test.c

 

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");
       return 0;
10 }

 

:wq!

 

 

[user1@CentOS /tmp/test]$ vi test.c


 - user1에서 'test.c'를 vi 편집기로 오픈한 상태에서, 새로운 putty 창을 열어 root로 접속하여 다음과 같은 swp 파일을 확인한다.

 

login as: root
root@192.168.1.2's password:
Last login: Wed Jan 20 13:16:19 2016 from 192.168.1.1
[root@CentOS /root]#
[root@CentOS /root]# cd /tmp/test
[root@CentOS /tmp/test]# ls -a
.  ..  .test.c.swp  test.c

      

 - '.test.c.swp' 파일은 이미 다른 사용자가 vi 편집기로 오픈하고 있을 경우, 메모리에 올라가있는 swp 파일

 - 만약, root에서 'test.c'를 vi 편집기로 오픈할 경우, 다음과 같은 경고 메세지가 출력된다.


[root@CentOS /tmp/test]# vi test.c

E325: 주목
Found a swap file by the name ".test.c.swp"
          소유자: user1   날짜: Wed Jan 20 13:33:53 2016
         파일 이름: /tmp/test/test.c
          수정: 아니오
         사용자 이름: user1  호스트 이름: CentOS
        프로세스 ID: 24230 (아직 실행중)
While opening file "test.c"
             날짜: Wed Jan 20 13:33:25 2016

(1) 다른 프로그램이 같은 파일을 고치고 있는중일 수 있습니다.
    만약 그렇다면 같은 파일을 두 개의 프로그램에서 고치지
    않도록 조심하시기 바랍니다.
    끝내거나 위험을 감수하시려면 계속하십시오.

 

(2) 파일을 고치다가 죽었었습니다.
    만약 그렇다면 ":recover" 혹은 "vim -r test.c"
    을 사용하여 복구하십시오 (":help recovery" 참고).
    이미 복구하셨었다면 스왑파일 ".test.c.swp"
    to avoid this message.

스왑 파일 ".test.c.swp"이 이미 존재합니다!
읽기 전용으로 열기([O]), 그냥 고치기((E)), 복구((R)), 끝내기((Q)), 버리기((A)):

 

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");
       return 0;
10 }

 

:q

 

 

 - root 및 user1에서 vi 편집기를 종료한다.

 

 

 

Ex11) vi 편집기 작업 중 시스템 오류 또는 재부팅/정전시 vi 편집기 작업 내용 복구

 

[user1@CentOS /tmp/test]$ vi test.c

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");

9        puts("Hello CCIE");    // 설정 추가
10        return 0;
11 }

 

 


 - root에서 강제로 user1 vim 프로세스 종료 실시


[root@CentOS /tmp/test]# ps -ef | grep vim
user1    24349 24076  0 13:49 pts/1    00:00:00 vim test.c
root     24353 24203  0 13:49 pts/0    00:00:00 grep vim

[root@CentOS /tmp/test]# kill -KILL 24349


 

 - user1 Putty 창 확인 

 

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");

9        puts("Hello CCIE"); 죽었음
[user1@CentOS /tmp/test]$

11 }
 

 


[user1@CentOS /tmp/test]$ cat test.c
/* test c program */
// this is a comment too.

#include <stido.h>
int main()
{
        puts("Hello CCNA");
        puts("Hello CCNP");
        return 0;
}


[user1@CentOS /tmp/test]$ ls -a
.  ..  .test.c.swp  test.c

        ---------- vi 편집기가 비정상적으로 종료되면, swp 파일이 남아있기때문에 복구가 가능하다.

 

 

[user1@CentOS /tmp/test]$ cat .test.c.swp
U3210#"! Ut X`user1CentOS/tmp/test/test.cutf-8
           ade
              ▒▒▒▒▒▒▒▒rge}      return 0;       puts("Hello CCIE");     puts("Hello CCNP");     puts("Hello CCNA");{int main()#include <stdio.h>//this is a comment too./* test c program */[user1@CentOS /tmp/test]$
[user1@CentOS /tmp/test]$


[user1@CentOS /tmp/test]$ vi test.c

E325: 주목
Found a swap file by the name ".test.c.swp"
          소유자: user1   날짜: Wed Jan 20 13:49:21 2016
         파일 이름: /tmp/test/test.c
          수정: 예
         사용자 이름: user1  호스트 이름: CentOS
        프로세스 ID: 24349
While opening file "test.c"
             날짜: Wed Jan 20 13:49:07 2016

(1) 다른 프로그램이 같은 파일을 고치고 있는중일 수 있습니다.
    만약 그렇다면 같은 파일을 두 개의 프로그램에서 고치지
    않도록 조심하시기 바랍니다.
    끝내거나 위험을 감수하시려면 계속하십시오.

(2) 파일을 고치다가 죽었었습니다.
    만약 그렇다면 ":recover" 혹은 "vim -r test.c"
    을 사용하여 복구하십시오 (":help recovery" 참고).
    이미 복구하셨었다면 스왑파일 ".test.c.swp"
    to avoid this message.

스왑 파일 ".test.c.swp"이 이미 존재합니다!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
 스왑 파일 ".test.c.swp"이 이미 존재합니다!
"test.c" 10L, 156C
스왑 파일 ".test.c.swp"을(를) 사용합니다
원래 파일 "/tmp/test/test.c"
복구가 끝났습니다. 모든 게 정상인 지 확인해 보셔야만 합니다.
(어쩌면 다른 이름으로 저장하고 싶으실 지도 모르겠습니다
그리고 바뀐 내용을 확인하려면 diff를 이용하십시오)
나중에 .swp 파일을 지우십시오.


Press ENTER or type command to continue

1 /* test c program */
2 // this is a comment too.
3 #include <stdio.h>

4

5 int main()
{
7        puts("Hello CCNA");
       puts("Hello CCNP");

9        puts("Hello CCIE");
10        return 0;
11 }

 

:wq!

 

 

[user1@CentOS /tmp/test]$ cat test.c
/* test c program */
// this is a comment too.

#include <stido.h>
int main()
{
        puts("Hello CCNA");
        puts("Hello CCNP");
        puts("Hello CCIE");
        return 0;
}

[user1@CentOS /tmp/test]$ ls -a
.  ..  .test.c.swp  test.c

 

 - 복구가 되어도, 파일이 남아있기 때문에 삭제를 해야한다.

 - 만약, 삭제를 하지 않으면, 'test.c' 파일을 오픈할때 마다 경고 메세지가 나온다.


[user1@CentOS /tmp/test]$ rm .test.c.swp
[user1@CentOS /tmp/test]$ ls -a
.  ..  test.c


 

 

[root@CentOS /tmp/test]# cd ..
[root@CentOS /tmp]# rm -rf test

 

 

[root@CentOS /tmp/test]# cd ..
[root@CentOS /tmp]# rm -rf test

[root@CentOS /tmp]# cd

 

 

 - ' vimtutor'를 실시하여 vi 편집기 연습을 실시하도록 한다.

 

[root@CentOS /root]# vimtutor

 

 

VMware Snapshot을 실시한다.

 

VMware -> VM -> Shapshot -> Take Snapshot -> Snapshot 이름 '기본 명령어 학습 완료'

 

 

 

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q