Archive

Archive for the ‘sql’ Category

MYSQL Explain

August 4, 2008 Leave a comment

Explain 정보보는법

인덱스가 적절히 사용되고 있는지 검토
나열된 순서는 MYSQL 이 쿼리처리에 사용하는 순서대로 출력

EXPLAIN 의 각 행 설명

1. id : SELECT 번호, 쿼리내의 SELECT 의 구분번호

2. select_type : SELECT 의 타입

  • SIMPLE: 단순 SELECT (UNION 이나 서브쿼리를 사용하지 않음)
  • PRIMARY: 가장 외곽의 SELECT
  • UNION: UNION 에서의 두번째 혹은 나중에 따라오는 SELECT
  • DEPENDENT UNION: UNION 에서의 두번째 혹은 나중에 따라오는 SELECT, 외곽쿼리에 의존적
  • UNION RESULT: UNION 의 결과물
  • SUBQUERY: 서브쿼리의 첫번째 SELECT
  • DEPENDENT SUBQUERY: 서브쿼리의 첫번째 SELECT, 외곽쿼리에 의존적
  • DERIVED: SELECT 로 추출된 테이블 (FROM 절 내부의 서브쿼리)

3. table : table명

4. type : 조인타입, 우수한 순서대로… 뒤로갈수록 나쁜 조인형태

  • system
    테이블에 단 하나의 행만 존재(시스템 테이블). const join 의 특수한 경우
  • const
    많아야 하나의 매치되는 행만 존재할 때
    PRIMARY KEY 나 UNIQUE index 를 상수와 비교할 때
    각 컬럼값은 나머지 연산에서 상수로 간주, 처음 한번만 읽어들이면 되므로 매우 빠름
  • eq_ref
    조인수행을 위해 각 테이블에서 하나씩의 행만이 읽히는 경우
    조인연산에 PRIMARY KEY 나 UNIQUE index 인덱스가 사용되는 경우
    인덱스된 컬럼이 = 연산에 사용되는 경우
  • ref
    이전 테이블과의 조인에 사용될 매치되는 인덱스의 모든행이 이 테이블에서 읽혀질 때
    leftmost prefix 키만을 사용하거나 사용된 키가 PRIMARY KEY 나 UNIQUE 가 아닐때
    (즉 키값으로 단일행을 추출할수 없을때)
    사용된 키가 적은수의 행과 매치되면 이것은 적절한 조인 타입
    ref 는 인덱스된 컬럼과 = 연산에서 사용됨
  • ref_or_null
    ref 와 같지만 NULL 값을 포함하는 행에대한 검색이 수반될 때
    서브쿼리 처리에서 대개 사용됨
  • index_merge
    인덱스 병합 최적화가 적용되는 조인 타입
    이 경우, key 컬럼은 사용된 인덱스의 리스트를 나타내며
    key_len 컬럼은 사용된 인덱스중 가장 긴 key 명을 나타냄
  • unique_subquery
    몇몇 IN 서브쿼리 처리에서 ref 타입대신 사용됨
    unique_subquery 는 성능향상을 위해 서브쿼리를 단순 index 검색 함수로 대체함
  • index_subquery
    unique_subquery 와 마찬가지로 IN 서브쿼리를 대체
    단, 서브쿼리에서 non-unique 인덱스가 사용될때 동작 함
  • range
    인덱스를 사용하여 주어진 범위 내의 행들만 추출
    key 컬럼: 사용된 인덱스
    key_len: 사용된 가장 긴 key 부분
    ref 컬럼: 이 타입의 조인에서 NULL
    키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용됨
  • index
    인덱스가 스캔된다는걸 제외하면 ALL 과 같음
    일반적으로 인덱스 파일이 데이타파일보다 작기 때문에 ALL 보다는 빠름
    MySQL 은 쿼리에서 단일 인덱스의 일부분인 컬럼을 사용할때 이 조인타입을 적용함
  • ALL
    이전 테이블과의 조인을 위해 풀스캔
    (조인에 쓰인) 첫번째 테이블이 고정이 아니라면 비효율적
    대부분의 경우에 아주 느린 성능
정리:
system – const – eq_ref – ref – ref_or_null – index_mergy – unique_subquery – index_subquery – range – index – ALL

5. possible_keys : MySQL 이 해당 테이블의 검색에 사용할수 있는 인덱스들
possible_keys 에 나타난 인덱스들이 결과에 나타난 테이블 순서에서 실제 사용할 수 없을수도 있음

6. key :  MySQL 이 실제 사용한 key(index)

7. key_len : MySQL 이 사용한 인덱스의 길이, key 컬럼값이 NULL 이면 이값도 NULL
key_len 값으로 MySQL 이 실제 복수컬럼 키중 얼마나 많은 부분을 사용할 것인지 알 수 있음

8. ref : 행을 추출하는데 키와 함께 사용된 컬럼이나 상수값

9. rows : 쿼리 수행에서 MySQL 이 예상하는 검색해야할 행수

10. Extra : MySQL 이 쿼리를 해석한 추가적인 정보를 나타냄

  • Distinct: MySQL 이 매치되는 첫행을 찾는 즉시 검색을 중단한다는 의미
  • Not exists: MySQL 이 LEFT JOIN 을 수행함에 매치되는 한 행을 찾으면 더이상 매치되는 행을 검색x
  • range checked for each record (index map: #): MySQL 이 사용할 좋은 인덱스가 없음 의미
  • Using filesort: MySQL 이 정렬을 위해 추가적인 과정을 필요로 함
  • Using index: 컬럼정보가 실제 테이블이 아닌 인덱스트리에서 추출, 쿼리에서 단일 인덱스된 컬럼들만을 사용하는 경우
  • Using temporary: MySQL 이 결과의 재사용을 위해 임시테이블을 사용, 쿼리 내에 GROUP BY 와 ORDER BY 절이 각기 다른 컬럼을 사용할때 발생
  • Using where: WHERE 절이 다음 조인에 사용될 행이나 클라이언트에게 돌려질 행을 제한하는 경우 테이블의 모든 행을 검사할 의도가 아니면 ALL 이나 index 라면 쿼리사용이 잘못된 것임
  • Using sort_union(…) , Using union(…) , Using intersect(…)
  • Using index for group-by: Using index 와 접근방식이 같으며, 추가적인 디스크 접근 없이 GROUP BY 나 DICTINCT 쿼리에 사용된 모든 컬럼에 대한 인덱스를 찾았음을 의미
정리:
쿼리를 가능한 한 빠르게 하려면, Extra 값의 Using filesort 나 Using temporary 에 주의해야 함
EXPLAIN 의 출력내용중 rows 컬럼값들을 곱해봄으로써 얼마나 효과적인 join 을 실행하고 있는지 알 수 있다

http://database.sarang.net/?inc=read&aid=24199&criteria=mysql

http://radiocom.kunsan.ac.kr/lecture/mysql/explain_select_fields.html

Tags: , ,

MySql Bug "Calling MySQL5 stored procedures multiple times from PHP5"

January 8, 2008 Leave a comment

[참고 :  MySql Bug "Calling MySQL5 stored procedures multiple times from PHP5" ]
PHP 5와 MySQL 5를 연동하여 사용하는 조건에서 procedures를 호출(call)/query하는 도중 db접속을 까먹는 현상.

 

  • 오랫동안 db에 접근이 없다  Query를 하면 “Lost connection to MySQL server during query”같은 에러가 뜬다?
    한번 Lost Connection이 뜨고 난뒤에 다시한번 Query하면 다시 정상 작동?
  • Mysqli  Bug?
    일반 Select 구문은 여러번 실행해도 별 문제 없지만, procedure 호출을 위한 call 한번만해도 connection이 그냥 끊겨 버립니다.

 

[해결방안 또는 필요 사항]

  1. PDO 사용.
  2. 하나의 procedures 종료 후 다시 DB를 connect.
    (이때 procedures는 insert, update, select등의 연속 작업을 피하고 하나의 작업만 해야 한다)
  3. 하나의 procedures에서 모든 값을 처리 후 MYSQL_MULTI_QUERY로 해결.

 

PDO 란 무엇인가?

MYSQL_MULTI_QUERY란 무엇인가?

기본적인 쉘 명령어 모음

December 27, 2007 Leave a comment

ls(list) : 파일의 리스트를 보여준다. 도스의 dir과 비슷하다.

ls [-ailFRC] [파일 또는 디렉토리]자주 쓰이는 옵션은,

-l 파일에 대한 긴 정보(파일 허용권, 소유자, 그룹, 크기, 날짜)를 준다.

-a .으로 시작하는 파일은 도스의 숨겨진 파일과 같아서 보려면 이 옵션을 주어야 한다.

-i I-node를 보여준다.

-t 가장 최근에 변경된 파일을 최근의 것부터 보여준다.
-u 변경되지 않았더라도 최근에 엑세스했던 파일들을 보여준다.
이 t나 u 옵션으로 최근에 다루었던 파일을 찾는데 유용하게 쓸 수 있다.

-F 파일의 특성을 보여준다.
이름 뒤에 디렉토리면 /를 실행파일이면 *, 심블릭 링크된 파일이면 @를 붙여준다.
-R 하위 디렉토리의 파일도 모두 보여준다.
예) ls -al, 또는 ls -alF

 

cp(copy) : 파일을 복사한다.

cp file1 file2
cp file(s) directory
[-r] option을 주면 directory도 copy가 가능하다.
file1을 file2로 복사한다.
또, 하나 혹은 여러 개의 파일을 directory에 복사한다.

 

mv(move) : 파일이나 디렉토리의 위치를 바꾸거나 이름을 바꾼다. 사용법은 다음과 같다.

1.mv [options] oldname newname
2.mv [options] file(s) directory

1의 경우 파일 oldname을 newname으로 이름을 바꾼다.
2의 경우 file(s)를 directory로 옮긴다. 사용할 수 있는 옵션은 다음과 같다.
-f 옮겨질 디렉토리에 존재하는 파일이 있으면 덮어쓴다.
-i 옮겨질 디렉토리에 존재하는 파일이 있으면 확인한다.
-v 옮기기 전에 파일명을 출력한다.

 

rm(remove) : 파일을 제거한다. 리눅스에서는 한번 지운 파일은 다시 복구할 수 없다.

rm [options] file(s)

사용 가능한 옵션은 다음과 같다.

-f 쓸수 없는 파일이라도 물어보지 않고 강제로 지운다.
-i 각 파일에 대하여 지울 것인지 물어 온다.
-r 서브디렉토리를 포함한 모든 내용을 재귀적으로 지운다.
-v 지워지는 파일명을 출력한다.

 

cd(change directory) : 현재 작업 디렉토리를 변경한다.

cd [directory name]

디렉토리 이름이 생략되었을 경우에는 login한 홈디렉토리($HOME,~로 표시한다)로
변경된다. [.]은 현재 디렉토리, [..]는 상위디렉토리, [/]는 root디렉토리를 나타낸다.

 

mkdir(make directory) : 디렉토리를 만든다.

mkdir dir(s)

 

rmdir(remove directory) : 디렉토리를 지운다. 만약 디렉토리가 비어있지 않으면 지울 수 없다.

pwd(print working directory) : 현재 작업 Directory를 출력한다.

 

chmod(change mode) : 파일이나 디렉토리에 대한 접근 허용 범위를 변경한다.

리눅스는 사용자 번호(UID)와 그룹 번호(GID)를 가지고 모든 사용자를 구분한다.
파일은 그것을 생성한 소유자에게 속해 있으며, 이 명령으로 다른 사람들에게
자기 파일에 대한 접근 권한을 줄 수 있다.

chmod [options] 8진수mode file(s)
chmod [options] symbolic-mode file(s)

우선 심볼 모드를 사용하여 보자. symbolic mode는 각각 다음과 같은 의미를
지니며 이것들을 조합하여 설정한다.

접근 권한

r 읽기 허용
w 쓰기 허용
x 실행 허용

허용 대상

u 사용자(소유자)
g 그룹
o 기타(사용자와 그룹을 제외한 사람)
a 전체

u,g,o,a를 각각 r,w,x와 같이 +,-,=로 조합하여 사용한다. 각각 다음에 예를 보자.

chmod o-r,o-w filename 또는 chmod o-rw filename

파일을 기타 사용자가 읽지도 쓰지도 못하게 만든다.

chmod a+r *.c

.c로 끝나는 모든 파일을 전체 사용자가 읽을 수 있게 만든다.

chmod o=r run.cmd

run.cmd라는 파일을 가타 사용자가 읽을 수만 있게 만든다. 이것은 o, 즉
다른 모든 사람에게 주어진 권리를 모두 없애고 오직 r만을 활당한다.
8진수 mode를 사용한 경우는 3개의 숫자로 구성되며 각각 소유자, 그룹,기타
사용자의 접근 권한을 나타낸다.

접근 권한

4 읽기 허용
2 쓰기 허용
1 실행 허용

허용 대상

셋째자리 소유자
둘째자리 그룹
첫째자리 기타 사용자

예를 들어 chmod 755 aa.run고 쓰면

aa.run이라는 파일에 대해 소유자는 읽기, 쓰기, 실행이 가능하고(7=4+2+1)
그룹과 기타 사용자는 읽기와 실행만 가능하게 설정된다.(5=4+1)
디렉토리에도 파일과 똑같은 접근 권한이 있다.
디렉토리의 접근 권한은 좀 특이하게 해석 된다.
디렉토리란 파일들의 목록이 기록된 또 하나의 파일이라고 볼 수 있다.

그러므로 디렉토리에 대한 읽기권한이란 디렉토리의 내용 즉, 파일 리스트를 볼 수 있는 권한을 말한다. 또 쓰기란 파일 리스트를 추가하거나 지우는 것이므로, 그 디렉토리에서 파일을 만들고 지울 수 있는 권한을 말한다.
cd를 실행하지 못한다면 그 디렉토리에 대한 검색 역시 불가능하다. 그러므로 어떤 파일에 대해 쓰기 권한이 없다고 해도 그 파일이 있는 디렉토리에 대한 쓰기 권한을 가지고 있다면 그 파일을 지울 수가 있으니 유의해야 한다.

-R 서브 디렉토리의 파일까지 재귀적으로 실행된다.
-f 자기 소유가 아닌 파일에 까지 변경을 시도한다. 에러 메시지를 보여주진 않는다.
-v 변경되는 모드에 대해 보여준다.

 

chown(change owner) : 파일의 소유권자를 변경할 때 사용한다.

root는 어느 파일이든지 변경이 가능하지만, 그외의 사용자는 자신 소유의 파일에 대해서만 소유자를 변경할 수 있다.
chown newowner 파일 또는 디렉토리
newowner는 User ID또는 User Name 모두 가능하다.


chgrp(change group) : 이것은 파일 소유권자의 그룹을 바꾸는 명령어인데, chown의 기능과
유사하다.

chgrp newgroup 파일 또는 디렉토리newgroup는 Group ID 또는 Group Name 모두 가능하다.


file : 파일의 종류를 알아본다.

file file(s)
파일의 종류를 분류한다. 전형적 분류의 몇가지 예로서 directory, asciitext,commands
text(shell scripts), c program text, executable not stripped, English text, empty등이
있으나 항상 정확하지는 않다.


touch

touch [option] filename
파일에는 세 종류의 시간표시(time stamp)가 있다. 파일이 처음 만들어진 시간
(creation time)과 파일이 변경된 시간(modification time), 그리고 최근에 읽었던 시간
(access time)등이 기록된다. 이 중 touch로 파일의 변경시간과 읽어던 시간을 바꿀 수
있다. 없는 파일 이름을 인자로 쓰는 경우는 새 파일(크기 0)이 만들어진다.
-t 월일시분[.초] : 현재 시간대신 특정시간으로 정할 경우
-m 파일 변경 시간을 바꾸는 경우
-a 파일을 읽었던 시간을 바꾸는 경우


find : 파일을 찾아서 특별한 기능을 실행 한다.

find path test action path아래의 모든 파일을 찾는다.
test에는 다음의 탐색식을 줄 수 있다.
-name 파일 이름 : 파일 이름과 일치하는 파일만 찾는다. 파일 이름에 메타 문자를
쓰기 위해서는, 파일 이름을 ” “로 인용하거나 *을 스케이프시켜 써야 한다.
-perm 파일 모드 : 모드가 같은 파일만을 찾는다.
-type 파일 종류 : 파일 종류가 같은 것만을 고른다. 파일종류는 다음과 같은 것들이 있다.

b블럭(버퍼를 사용하는) 장치파일,
c문자(버퍼를 사용하지 않는)장치파일,
d디렉토리,
f일반 파일,
l심볼릭 링크된 파일,
p파이프,
s소켓


action은 다음과 같은 것이 주로 쓰인다
.

-print : 파일 이름을 보여준다. 디폴트로 정해져 있다.
-exec command {}\; : find한 파일에 대해 command를 실행한다.
-ok command {}\; : find한 파일에 대해 command 확인을 받으며 실행한다.
이런 표현식은 두가지를 같이 쓸 수 있다. 이스케이프된 \( \)로 싸고 양쪽에 한 칸씩을 비워두어야 한다.
-not expr1 : expr1에 해당하지 않는 것을 대상으로 한다.
-expr1 -o expr2 : expr1이나 expr2를 만족하는 것을 대상으로 한다.
-expr1 -a expr2 : expr1이나 expr2를 동시에 만족하는 것을 대상으로 한다.

다음의 예를 보자.

find . -name “*.c” -print
현재 디렉토리 아래(서브 디렉토리도 포함)에 있는 파일중에서 .c로 끝나는 파일을 보여준다.

find/ \( -name *.c -o -name *.txt \ ) -exec rm {} \;
전체 디스크 안에 .c로 끝나는 파일과 .txt로 끝나는 파일을 지운다.


grep(Generalized Regular Expression Parser)

파일중에서 특정 패턴을 갖는 파일의 라인을 탐색한다. egrep, fgrep등의 버전이 있다.
grep [options] [file(s)]
-i 옵션은 탐색할 때 대, 소문자를 구분하지 않으며, 파일 이름이 지정되어 있지 않으면
표준 입력에서 찾는다.
-w 단어의 일부분이 아니라 전부와 일치된 것만 찾는다.


cmp(compare)

두 파일이 어디가 다른지를 비교한다.
cmp file1 [file2]
두 번째 파일을 쓰지 않으면 표준 입력과 비교한다.


cat

conCATenate에서 나온 말로 파일의 내용을 표준 출력으로 내보내어, 파일내용을
알아보거나, 여러 파일을 하나의 파일로 출력하여 연결한다. 또는 표준 입력으로부터
파일을 만들 수도 있다.

cat [options] [file(s)]
파일 이름이 주어지지 않으면, 표준 입력으로 입력 받는다. 옵션은 다음과 같은 것들이 있다.

-n 행 번호를 붙인다.
-u 버퍼를 통하지 않고 출력시킨다.
-A 화면 제어 문자를 보여준다. 라인의 끝은 $, 탭문자는 ^l로 보여준다.

다음의 예를 보자.
cat dict1 dict2 > dictionary
dict1 과 dict2 파일을 연결하여 dictionary라는 파일에 저장한다.
cat > memo
control-D를 입력할 때까지 키보드(표준 입력)에 입력한 내용을 memo라는 파일로 저장한다.


head : 파일의 선두를 보여준다.

head [-count] [file(s)]
count에 정해준 줄 수 만큼 file(s)의 첫부분을 보여준다. count를 정해주지 않으면 파일의 첫 10줄의 보여주며 file이 정해지지 않으면 표준 입력을 사용한다.


tail : 파일의 끝부분을 보여준다.

tail [-count] [file(s)]
사용법은 head와 똑같으며, 두 개를 조합해서 파일의 일부분을 자를 수 있다.
예를 들어,
head -30 junk.c | tail > /tmp/result와 같이 쓰면, junk.c라는 파일의 21번째 줄에서 30번째 줄까지의 내용을 /tmp/result에 저장한다.


cut : 파일의 각 행에서 선택된 필드 절단

cut -clist [file..]
-c 다음의 list는(공백 없음) 문자 위치를 지정한다.


ispell : 영어 단어의 철자를 확인한다.

ispell [options] [file(s)]
파일 이름을 써주면 해당 파일의 단어를 검사한다. 파일 이름없이 실행시키면
표준 입력의 단어를 체크한다. 해당하는 단어가 없을 때는 비슷한 단어들의
리스트를 보여준다.


more : 파일의 내용을 화면 단위로 끊어서 보여준다.

more file(s) : file이 지정되지 않으면 표준 입력을 사용한다.

more를 실행시키면 한 화면만큼의
내용을 표시하고 멈추게 되는데, 여기에 다음과 같은 명령을 쓸 수 있다.

h 도움말
space 다음 페이지
RETURN 라인 스크롤
q,Q 종료
b,^B 이전 페이지
/pattem 검색
= 현재 라인 번호 출력
:f 현재 파일 이름과 라인 번호를 보여준다.
! 서블쉘로 명령어를 실행한다.

사실 리눅스에서는 more라는 유틸리티는 없고 같은 기능을 하는 less라는
유틸리티가 있으며 이것이 more에 링크되어 있다.


tee

이것은 알파벳 문자 “T”를 발음대로 적은 것으로 하는 일이 T자형 파이프와 같다고
해서 붙어진 이름이다. T자형 파이프가 하는 일과 똑같이 어떤 내용을 두군데로
나누어서 보낸다. 즉 표준 입력을 읽어 표준 출력으로 보내면서 같은 내용을
파일에 쓴다.


wc

Word Count, 명시된 파일 또는 표준 입력 안의 행, 단어, 문자의 수를 센다.
wc [options] [file(s)]
다음과 같은 옵션이 있다.
-l 행(line)수만 출력한다.
-c 문자(charater)수만 출력한다.
-w 단어(word)수만 출력한다.
옵션을 주지 않으면 행수, 문자수, 단어수 모두 출력한다.


sort

sort [options] [file(s)]
파일의 내용을 정렬하여 출력한다. 파일의 이름이 정해지지 않으면 표준 입력을 사용한다.
사용할 수 있는 옵션은 다음과 같다.
-r 내림차순으로 소트
-b 선행하는 공백을 무시


man

주어진 명령이나 자원들의 매뉴얼을 출력한다.
more에서와 같이 페이지 넘기기나 탐색 명령을 줄 수 있다.

man [options] [section] command

-k 다음에 키워드를 주면 그것이 포함된 명령어를 보여준다.
이것이 apropos 명령과 같다.

-f 다음에 명령어를 적어주면 한 줄짜리 짧은 명령어 설명을 보여준다.
이것은 whatis 명령과 같다.

section은 다음과 같이 나누어져 있다. 해당 번호를 적으면 된다.
(1) User Commands
(2) System Calls
(3) Subroutines
(4) Devioes
(5) File Formats
(6) Games
(7) Miscellaneous
(8) Sys. Administration


whatis

whatis command(s)
명령어에 대한 설명을 whatis 데이터베이스(/usr/man/whatis)에서 찾아 보여준다.

whereis
whereis command(s)
명령 인자로 준 명령을 $PATH로 지정된 경로에서 찾아 전체 경로명을 보여준다.

예를 들어
whereis csh
이라고 입력하면 다음과 같은 출력이 나온다.
csh: /usr/bin/csh/usr/man/man1/csh.1


which

which command(s)
명령어를 입력했을 때 실행되는 파일의 경로명을 보여준다. 예를 들어

which tin 이라고 입력하면
/usr/local/bin/tin 이라고 출력된다.

만약 alias된 명령이 있다면 alias내용을 보여준다.
만약 ls가 alias되어 있을 때

which ls라고 입력하면 다음과 같이 출력된다.
ls aliased to ls -CF

장치 관리 —–


mount/umount

마운트(mount)라는 개념은 유닉스 파일 시스템 관리의 독특한 방법이다.
이 방법을 통해 리눅스에서는 동시에 여러 가지 파일 시스템을 사용할 수 있게 된다.
시스템의 모든 디스크 장치들은 이 마운트라는 과정을 거쳐야만 사용할수가 있게 된다.
시스템이 처음 부팅이 될 때 자동적으로 ‘/’에 디스크를 마운트한다.
일단 ‘/’가 마운트된 후에는 그 파일 시스템의 서브 디렉토리중 하나로 원하는 디스크 장치를 마운트시켜 사용하게 된다.
그러므로 각기 다른 파일 시스템을 가진 디스크 장치라 하더라도 커널이 그 파일 시스템을 지원하기만 하면 각각 서브디렉토리에 마운트 시켜 사용할 수가 있게 되는 것이다.
일단 마운트된 디바이스를 Unmount할 때는 umount명령을 사용하면 된다(unmount가 아니다.)
umount를 umount되어지는 파일 시스템에서 실행을 시키면 아직 그 파일 시스템은 사용중(busy)이게 되므로 언마운트시 에러가 발생하게 된다.
언마운트는 꼭 그 파일시스템을 벗어나서 실행시켜야 한다.

mount [장치명 [option] -t file_system_type ] [directory]

아무 인자없이 mount라고만 쓰면 현재 마운트되어 있는 디바이스들과 연결된 디렉토리를 보여준다.
마운트되어 있는 디바이스 리스트를 보기위해 mount 명령을 사용하는 것은
누구나 가능하지만 실제로 디바이스를 mount하고 unmount하는 것은 root만이 가능하다.

장치명에는 /dev/hdal과 같은 디바이스 이름을 쓰고 file_system_type에는 그 디스크 장치가 포맷되어 있는 파일 시스템을 쓴다.

리눅스에서 사용 가능한 file_system_type옵션에는 다음과 같은 것이 있다.

ext2, ext, xia, msdos, hpfs, iso9660, minix

이중 msdos는 MS-DOS에서 사용하는 FAT파일 시스템을 말하며,
hpfs는 OS/2에서 사용하는 HPFS(High Performance File System), iso9660은 CD-ROM에서 사용하는 파일 시스템이다.
hpfs는 아직까지는 읽기 전용으로만 마운트 할 수 있으며, iso9660 역시 읽기 전용으로만 마운트가 가능하다. |
그것을 위해서는 option에 -r 옵션을 주면 읽기 전용으로 마운트 된다.
mount 뒤에 디렉토리 이름만 쓰면 mount는 /etc/fstab를 참조하여 그 디렉토리 이름이 있으면 /etc/fstab에 정의되어 있는대로 디바이스, 파일시스템, 옵션 등을 설정하여 마운트한다.
mount -a 역시 /etc/fstab를 참조하여 그 곳에 있는 모든 파일 시스템을 마운트시킨다.
unmount를 할 때는 단순히 umount directory_name 또는 umount device_name을 써주면 되고
umount -a 라고 쓰면 현재 마운트 되어 있는 디스크장치들 중에서 /etc/fstab에 있는 모든 장치를 unmount한다.
그리고, 마운트된 디스크 장치들과 디렉토리의 리스트는 /etc/mtab에 저장되어 있다.

다음을 예를 들자.

mount /dev/fd0h1440 -t mados /A

MS-DOS형식으로 포맷된 1.44M floppy diskette를 /A라는 디렉토리에 마운트 한다.
이렇게 한 후에 ls /A라는 명령을 실행시키면 그 floppy diskette의 root diretory의
내용을 보여준게 된다. 즉, /A라는 디렉토리가 flppy의 root diretory가 되는 것이다.
mount /dosC/dosC라는 디렉토리에 연결된 디바이스, 파일 시스템, 옵션 등을 /etc/fstab를 참조하여 마운트 한다.

df

device free, 마운트된 파일시스템에서 사용 중이거나 사용 가능한 디스크 공간을 보여준다.
df [파일 시스템] 파일 시스템이 지정되지 않으면, 마운트된 모든 파일 시스템을 보여준다.

du

disk usage, 디렉토리나 서브 디렉토리, 파일의 사용 용량을 보여준다.

-a 디렉토리뿐만 아니라 파일의 크기도 보여준다.
-b KB단위가 아니라, byte 단위로 나타낸다.
-s 서브 디렉토리는 나타내지 않는다.

free

현재 메모리 사용량과 사용 가능한 남은량, 공유되고 있는 메모리량 등을 보여준다.
이때 가상메모리에 대한 정보도 함께 보여준다.

uptime

부팅한 이후로 얼마나 오랫동안 시스템이 사용되었는지 보여준다. 현재 시간, 사용된 시간, 현재 로그인한 수, 평균 부하등의 정보를 준다.

평균 부하는최근 1분, 5분, 10분 동안의 시스템의 사용 정도를 보여주는데, 0에 가까운 값은 시스템이 거의 사용되지 않고 있다는 것이고, 1에 가까운 값은 과중되지 않고 모두 쓰이는 상태, 1이상의 큰 값은 여러 프로그램이 동시에 실행중인 정도를 나타낸다.

w

현재 로그인한 사용자가 무엇을 하고 있는지 보여준다.
uptime의 정보가 헤더로 쓰인다.
JCPU는 사용자가 사용한 CPU시간을 PCPU는 현재 작업에 쓰이는 CPU 사용 시간을 보여준다.

lpr

라인 프린터 스풀러, 오프라인 프린터로 명시된 파일(생략된 경우에는 표준 입력)을 인쇄한다.
파일을 프린트하는 직접적인 방법은 프린터 장치 디바이스에 복사하는 것이다.

# cp filename /dev/lp1

그러나 lpr명령을 사용하면 /etc/printercap을 통해서 여러 포맷의 파일들을 프린터 기종에 맞게 출력시키고, 또 printer queue를 통해서 프린트하게 되므로 큐에 있는 파일을 취소할 수 있다.

/etc/printercap의 내용은 직접 다루지 않고 apsfilter를 이용하면 된다.

lpr [options] [file(s)]
이것을 제대로 사용하려면 lpd (line printer daemon)이 실행되어 있어야 한다.

lpq

line printer queue.lpr명령으로 printer queue에 들어간 파일의 소유자와 파일명 그리고 잡번호를 보여준다.

lprm

line printer remove, 프린터 큐에 들어있는 파일 프런트를 취소시킨다.

#lprm 잡번호
잡번호는 lpq를 실행시켰을 때 보이는 것이다.

tty

컴퓨터 시스템에 연결되어 사용하고 있는 터미널의 경로 이름을 알려준다.

tset

terminal set, 단말기 유형을 결정하는 프로그램이다.
에디터 같은 여러 유틸리티에서 화면 제어를 위해서, 사용되는 터미널의 유형 인식을 위해서 필요하다.

쉘변수 $TERM값을 결정한다.

프로세스 제어—–

리눅스와 도스의 가장 큰 차이는 바로 멀티태스킹(multitasking)에 있다.
프로세스 상태를 다루는 명령은 ps/kill과 잡 콘트롤을 위한 쉘 내부 명령으로 fg/bg/jobs가
있다.

잡 콘트롤은 쉘의 기능에서 살펴보고, 우선 프로세스에 대한 개념과 그것을다루는 명령을 알아보자.

task라는 말은 프로세스와 같은 말인데, 커널이 볼 때 데이터를 처리하는 최소 단위라고 할 수 있고, 사용자가 볼 때는 현재 실행 중인 프로그램을 뜻한다.
프로세스들은 프로세스 스케쥴러가 실행 순서를 조절하고 있다.
멀티 태스킹이 가능한 것은 하나의 프로세스가 CPU를 독점하는 것이 아니고, 프로세스 스케쥴러가 정해진 시간 만큼만
CPU를 사용할 수 있도록, 일정한 시간간격마다 프로세스들을 교체시키고 있기 때문이다.
그래서 프로세스에 따라서는 실행 중일 때도 있고, 잠시 멈춘 상태일 때도 있다.

ps

process status, 프로세스의 상태를 알려준다.

-l 긴 포맷으로 출력시킨다.
-u 사용자 이름과 시작한 시간을 보여준다.
-j 프로세스 그룹 아이디를 보여준다.
-s 시그날 포맷으로 보여준다.
-m 메모리 정보를 보여준다.
-a 다른 사용자의 프로세스들도 보여준다.
-e 명령어의 옵션까지 보여준다.
-w 폭이 넓은 라인은 다음 라인으로 이어서 출력시킨다.
-r 실행중(STAT R)인 프로세스만 보여준다.
-x daemon프로세스와 같은 현재 터미널과 관계없는 프로세스 상태도 보여준다.

daemon프로세스란 앞에 나타나지 않고 뒤에서 시스템의 관리를 하는 프로세스를 말한다.
보통 시스템이 부팅이 될 때 자동적으로 실행이 된다.
ftpd, inetd, lpd, nfsd등이 있다.
명령을 실행시켰을 때 헤더에 보이는 것들은 다음과 같은 것을 의미한다.

PRI 프로세스에게 할당된 timeslice를 Hz단위로 보여준다.
NI 우선 순위를 나타낸 nice값
SIZE text+data+stack을 합한 이미지 크기
Rss 프로세스가 현재 메모리에 상주해 사용하고 있는 크기(KB단위)
WCHAN 프로세스가 이용중인 커널 함수
%CPU 마지막 분동안 프로세스가 사용한 CPU시간의 백분율
%MEM 마지막 분동안 프로세스가 사용한 메모리의 백분율
START 프로세스가 생성된 시간
TIME 현재까지 사용한 CPU시간
TRS text의 상주 크기
SWAP swap하는 크기(KB단위)
SHARE 공유메모리
STAT 프로세스 상태, 다음과 같이 나타낸다.
R 수행중, S 대기중, T 일시정지
D 디스크 입출력같은 인터럽트 할 수 없는 대기중.
Z zombie 좀비 프로세스, W 상주한 페이지가 없는 프로세스

좀비 프로세스란 실행이 끝났는데도 종료되지 못하고 있는 프로세스이다.
프로세스는 프로세스 테이블에 각각의 프로세스 아이디와 사용하는 자원들이 적혀 있다.
자식 프로세스가 만들어지면 여기에 등록이 되고 실행이 끝나면 지워지게 되어있는데, 좀비 프로세스는 아직 그 정보가 지워지지 않은 상태이다.

좀 더 자세히 살펴보면, 리눅스의 프로세스는 PID가 1인 init로부터 시작된다.
이것이 모든 프로세스의 조상으로 fork()를 사용하여 자기와 똑같은 프로세스를 낳아 같이 실행된다.
새로 만들어진 프로세스(자 프로세스)는 새로 실행할 프로그램을 exec()를 사용하여 실행하다가, exit() 시스템 콜로종료된다.
이때 자식이 부모에게 SIGCHLD(17)시그널을 보내 받아들여지기를 기다리는 상태가 좀비 프로세스이다.
부 프로세스가 wait()로 그 신호를 처리하면 프로세스가 완전히 종료된다.

그러나 부 프로세스가 먼저 끝난 경우에는 자 프로세스는 고아가 된다. 이 때는 모든 프로세스의종료코드를 받아들이는 init프로세스가 양자로 받아들여 종료시키게 된다.

kill

프로세스에게 여러 가지 시그널을 보낸다. 보통 프로세스를 종료시키는데 쓰인다.
좀비 프로세스 또한 kill명령을 사용하여 끝낼 수 있다.

kill -signal pid와 같은 형식으로 사용하지만 -9(SIGKILL)이 무조건 종료시키기 위한 옵션으로 많이
쓰인다.
다른 시그널은 프로세스에 따라서 무시될 수도 있다.
꼭 kill이 아니더라도 프로세스에게 시그널을 보낼 수있는데, 컨트롤 Z(susp)를 누르면 SIGSTOP이, quit(^\)는
SIGQUIT, intr(^C)는 SIGINT가 실행중인 프로세스에게 전달된다.

nice

nice는 프로세스의 우선 순위를 바꾸어준다.
이것은 커다란 프로그램을 컴파일할 때와 같이 CPU나 메모리를 많이 쓰는 경우 전체 시스템 속도를 많이 저하시켜 마치 다운된 것처럼 만들어 버릴 수도 있기 때문에 다른 프로세스들에게 먼저 양보하는 선행(?)을 하게 한다.
그 정도를 -n뒤에 nice값으로 주어 명령을 실행시킨다.

#nice command -n XX

nice값은 -20에서 19까지 있는데, 값이 작을수록 우선 순위가 높다. -n옵션을 쓰기 않으면 디폴트로 10이 쓰인다.
일반 유저는 nice값을 증가시킬 수밖에 없지만 root는 nice값을 감소시켜 우선 순위를 높을 수도 있다.

백업 유틸리티—–

도스에서 pkzip이나 arj, lha등의 프로그램을 이용하여 파일들을 압축하고 백업해본 경험이 있는 사람이 있을 것이다.
리눅에서도 막강한 백업, 압축프로그램들이 있다.

compress/uncompress

전통적으로 유닉스에서 쓰여왔던 압축 프로그램이다.
이 프로그램은 압축율이 좋지않아 지금은 잘 사용되지 않고 다음에 설명할 gzip이 대신해서 많이 쓰이고 있다.
사용법은 다음과 같다.

compress [option] [file(s)]
uncompress [option] [file(s)]

파일 이름이 생략되면 표준 입력을 사용하고, 이때 출력 역시 표준 출력으로 보내진다.
압축된 파일은 파일 이름뒤에 .Z가 붙게되고 원래 파일은 지워진다. uncompress는 파일 이름을 써 줄 때 무조건 파일이름뒤에 .Z를 붙여서 해석하므로 파일 이름 뒤에 .Z가 붙지 않은 파일은 압축을 풀 수가 없다.
이런 파일은 파일 이름을 바꾼다음 이 명령을 실행해야 한다.

gzip/gunzip : gnu zip, 파일들을 압축한다.

이것은 파일들을 묶는 기능은 없으므로 파일들을 묶어서 압축 하려면 다음에 설명할 tar명령과 함께 써야 한다.
사용법은 다음과 같다.

gzip [option] [file(s)]
gunzip [option] [file(s)]

파일 이름이 생략되면 표준 입력을 사용한다.
표준 입력을 압축하였을 때는 압축된 결과가 표준 출력으로 보내지게 된다.
그러므로 이 경우에는 출력을 pipe나 리다이렉션을 통해 다른 파일로 보내야 한다.
gzip/gunzip은 압축을 풀거나 해제하고 나서 원래 있던 파일을 지운다.
파일을 압축할 때는 윈래 파일이름 뒤에 .gz라는이름을 붙여 압축된 파일임을 나타낸다.
주로 쓰이는 option에는 다음과 같은 것들이 있다. -1 파일을 압축하는 시간을 줄인다. 이렇게 하면 압축은 빨리 되지만 압축 효율이 떨어진다.
-9 파일을 최대로 압축한다. 당연히 이 방법은 시간이 많이 걸린다.
-r 서브 디렉토리에 있는 파일까지 재귀적으로 찾아서 압축한다.
-c 출력을 표준 출력으로 보낸다.
-d 압축을 푼다. gzip에만 쓰는 옵션이다.

재미있는 것은 gzip과 gunzip이 사실 같은 프로그램으로 이름만 다르게 링크되어 있다는 것이다.
이 유틸리티를 실행시키면 프로그램은 스스로의 이름을 조사해서 이름이 gunzip인 경우 자동적으로 -d옵션을 붙여 실행 시켜준다.

다음은 사용 예이다.

gzip -9 -r ./*
현재 디렉토리와 서브 디렉토리의 모든 파일을 최대 효율로 압축한다.
cat linux.src.gz | gunzip > /tmp/linux.src.list

linux.src.gz라는 파일을 압축을 풀어 /tmp/linux.src.list라는 파일에 저장한다.
물론 이러한 방법으로 압축을 풀면 원래 파일이 지워지지 않게 된다.

zmore(=zless), zcat

more나 cat와 같은 기능을 하는데 단지 대상이 보통 파일이 아니라 gzip으로 압축된 압축 파일이라는 점이 다르다.
리눅스의 FAQ나 많은 문서들은 gz으로 압축되어 있으며, 이런 파일들을 보기 위해서 따로 압축을 풀 필요없이 이것을 사용하면 편리하게 볼 수 있다.

tar : 파일들을 하나의 파일로 묶는다.

파일을 묶을 때 디럭토리를 지정하면 그 디렉토리안의 모든 파일과 모든 서브 디렉토리들이 함께 묶여진다.
또 tar는 파일의 속성, 하드 링크, 심볼릭 링크등이 고스란히 보존되므로 어떤 디렉토리 구조를 다른 곳으로 통째로 옮기려고
할 때 아주 편리하게 쓸 수 있다.

사용법은 다음과 같다.
tar command [file(s)]

사용할 수 있는 command는 다음과 같다.

c 새로운 tar파일을 생성한다.
x 기존의 tar파일을 푼다.
t tar파일 안에 들어 있는 파일들의 리스트를 보여준다.
v 어떤 명령을 실행할 때 대상이 되고 있는 파일들을 보여준다. 예를 들어 c명령으로 새로운 tar파일을 생성할 때 v를 같이 써주면 tar파일안에 묶어지고 있는 파일들의 이름과 크기를 보여준다.
f filename 작업 대상이 되는 tar파일의 이름을 지정한다. filename대신에 ‘-’를 쓰면 표준입력/표준 출력이 대상이 된다.

M floppy diskette등에 백업을 받을 때 여러장에 나누어서 백업 받을 수있게 한다.
이것은 다른 유닉스의 tar에는 대부분 없고, gnu tar에만 있는 기능이다.

그러므로 이 방법을 써서 만든 tar파일은 다른 유닉스의 tar에서 제대로 풀지 못하는 경우가 있으므로 주위해야 한다.
z tar파일을 생성할 때나, 풀 때 gzip을 필터로 사용한다. tar파일을 생성하면서 gzip으로 압축하거나 gzip으로 압축된 tar파일을 풀 때 편리한 기능이다.
이것 역시 gnu tar에만 있는 기능이다.

다음에 tar의 사용 예가 나와 있다.
tar cvzf ssa1.tgz src1/
src1이라는 디렉토리와 서브 디렉토리의 모든 파일을 묶은 다음 gzip으로 압축하여
ssa1.tgz라는 파일에 저장한다. 이 때 저장되는 파일의 이름과 크기도 함께 보여준다.
tar cvMf /dev/fd1H1440 src2
src2라는 파일(또는 src2라는 디렉토리와 서브 디렉토리의 모든 파일)을 /dev/fd1H1440이라는 디바이스(1.44M floppy diskette)에 tar형식으로 묶어 저장한다. 이때 묶어지는 파일의 크기가 디스켓 한 장의 크기를 넘어가면 여러장에 나누어 저장할 수 있게 한다.

gunzip xmris.tar.gz | tar xvf-
xmris.tgz라는 파일을 gunzip으로 압축을 푼다음, 그 내용을 현재 디렉토리에 푼다.

tar cvf -linuxdoom | gzip -9 > linuxdoom.tgz
linuxdoom이라는 디렉토리와 서브 디렉토리의 모든 파일을 tar로 묶은 다음 gzip으로 압축하여 linuxdoom.tgz라는 파일에 저장한다.

☞ tar로 묶은 파일은 접미어 .tar가 붙고 이것을 다시 gzip으로 압축하면 .tar.gz가 되는데,
이것을 합해서 .tgz라는 접미어를 붙이기도 한다.
그래서 .tgz라는 접미어가 붙은 파일을 gunzip으로 압축을 풀면 .tar라는 접미어가 붙은 파일이
생성된다.

zip/unzip : 이 프로그램은 많은 도스용 압축 유틸리티처럼 파일들을 묶어서 압축한다.

zip으로 파일들을 압축하면 .zip이라는 접미어가 붙은 파일이 생성되는데,
이 파일은 도스에서 많이 쓰이는 pkzip으로 생성한 파일과 포맷이 같다.
그래서 도스에서 pkzip으로 압축한 파일을 리눅스에서 unzip으로 풀 수 있다.
아무 옵션 없이 zip또는 unzip을 실행시킨다.

편집기—–

vi는 visual의 약자로 유닉스의 표준 편집기이다. ex라는 line editor를 바탕으로 만들어진 스크린 편집기로 dos의 일반적인 editor에 익숙해져 있는 사람들은 처음에는 불편하게 느껴지겠지만, 아주 편리한 환경과 막강한 기능을 제공하는 훌륭한 편집기이다.

vi는 full screen editor이므로 정확한 단말기 특성이 /etc/termcap안에 있어야 하며 환경 변수 $TERM이 정확이 정의되어 있어야 한다.
사실 리눅스에 들어 있는 것은 vi가 아니라 vi클론인 elvis가 vi에 링크되어 있는 것이며, 한국에서 배포되는 것 중에는
elvis를 한글화한 helvis가 들어 있는 것도 있다.

또 최근의 slackware버전에는 vim(vi improved)라는 향상된 기능의 vi클론도 같이 들어 있다.
많은 에디터가 있긴 하지만, 리눅스에 친근해지면 emancs를 꼭 써보기 바란다.
이 시대 마지막 해커라는 리차드 스토만의 역작으로 lisp로 짜여졌다.
여기에 emancs사용법까지 적는 것은 무리일 것같고, emacs의 help기능을 이용하여 많이 연습해보기 바란다.

vi

vi [options] [file(s)]

사용법예

vi filename 주어진 파일 이름으로 편집을 시작한다. 파일이 존재하지 않으면 새로 만들게 된다.
vi +15 filename 파일을 열면서 커서를 15번째 줄로 보낸다.
(또는 vi -c15 filename)

vi -r filename 손상된 파일을 복구할 때 쓰는 경우이다.파일을 편집하던중 갑작스런 사고등으로 인해 시스템이 다운되었을 경우 대개 이 명령으로

view filename 읽기 전용으로 파일을 연다.
vi *.c .c로 끝나는 모든 파일을 연다. vi는 여러 개의 파일을 읽어들여 편집할 수 있다

vi에서 세가지 모드가 있다.
첫째는 명령 모드이고
둘째는 입력모드,
셋째는 ex명령 모드이다.

처음에 vi를 구동하면 명령모드로 되어 있다.
명령모드에서 입력 명령(i, I,a, A, o, O)을 실행하면 입력 모드로 들어가게 된다.
또 어떤 모드에서든지 ESC를 누르면 명령 모드로 돌아온다. 명령 모드에서 ‘-’를 입력하면 ex명령 모드이다.

명령 모드에서 쓸 수 있는 명령을 알아 보자. 아래에서 #으로 표시된 부분은
임의의 숫자를 말한다.

커서 이동 명령

j(↓) 아래로 이동
k(↑) 위로 이동
h(←) 왼쪽으로 이동
l(→) 오른쪽으로 이동
G(go) 제일 끝줄로 이동
^b(back) 한 화면 위로 이동
^f(forward) 한 화면 아래로 이동
^u(up) 반 화면 위로 이동
^d(down) 반 화면 아래로 이동
e 한단어 뒤로 이동
b 한단어 앞으로 이동
0 줄의 제일 처음부터 이동
$ 줄의 제일 끝으로 이동

여기까지는 모두 다 익혀 둘만한 것들이다.
편집 상태로 진입

i 현재 커서 위치에 삽입
a 현재 커서 위치 다음에 삽입
o 현재 커서가 위치한 줄의 아랫줄에 삽입
I 현재 커서가 위치한 줄의 제일 앞에 삽입
A 현재 커서가 위치한 줄의 제일 뒤에 삽입
O 현재 커서가 위치한 줄의 제일 위에 삽입

현재 커서 위치에 삽입(i)과 현재 커서 위치 다음에 삽입(a), 그리고 현재 라인 끝에
삽입(A)과 다음 라인에 삽입(o) 정도는 익혀두는 것이 좋다.

지우기

x 현재 커서 위치의 문자를 지운다.
dd 현재 커서가 위치한 줄을 지운다.
#dd 현재 커서가 위치한 줄에서 아래로 #개 만큼의 줄을 지운다.
dw 현재 커서가 위치한 단어를 지운다.
#dw 현재 커서가 위치한 단어로부터 뒤로 #개 만큼의 단어를 지운다.

한 단어를 지우는 x명령과 라인을 지우는 #dd이 빈번히 쓰인다. 이 명령들로 삭제된
것들은 stack 구조의 버퍼에 저장된다. 그래서 9개까지는 이전에 삭제된 것들이
저장되어 있기 때문에, p명령으로 다시 불러서 쓸 수 있다. 그래서 xp를 실행하여
현재 위치의 문자와 다음 위치의 문자가 서로 바꾸는데 쓸 수 있다. stack은 LIFO구조이기
때문에 현재 지운 것부터 1번으로 해서 이전 것이 2번 하는 식으로 번호를 붙여 불러낼
수가 있다. “2p와 같은 식으로 이전 번에 지웠던 것을 다시 불러낼 수 있다. 그러나
번호로 이름을 기억하는 것은번거로운 것이기 때문에 이름이 붙은 버퍼를 쓸 수 있도록
되어있다. 아래를 보자.
“xdd 이것은 x라는 버퍼에 지운 라인을 보관한다.
“ydw 이것은 y라는 버퍼에 지운 단어를 보관한다.
복사하기와 붙이기

yy(Y) 현재 커서가 위치한 줄을 버퍼에 복사한다.
#yy(#Y) 현재 커서가 위치한 줄에서 아래로 #개 만큼의 줄을 버퍼에 복사한다.
yw 현재 커서가 위치한 단어를 버퍼에 복사한다.
#yw 현재 커서가 위치한 단어로부터 뒤로 #개의 단어를 버퍼에 복사한다.
“xyy x라는 버퍼에 라인을 카피한다.
“zyw z라는 버퍼에 단어를 카피한다.
p 버퍼에 들어 있는 내용을 현재 커서가 위치한 줄의 아래에 붙인다.
P 버퍼에 들어 있는 내용을 현재 커서가 위치한 줄의 위에 붙인다.
“xp x버퍼에 들어있는 내용을 p한다.
“xP x버퍼에 들어있는 내용을 P한다.

바꾸기

바꾸기 명령을 실행하면 바꾸기 명령의 범위 가장 끝에 $가 표시 된다. 바꾸고자 하는
내용을 입력한 후 ESC를 누르면 바꾸기 명령의 대상이 새로 입력한 내용으로 바뀐다.
r 현재 위치의 문자를 바꾼다.
cw 현재 위치의 단어를 바꾼다.
cc 현재 커서가 위치한 줄을 바꾼다.
C 현재 커서가 위치한 곳으로부터 줄의 끝까지 바꾼다.
#cw 현재 위치로부터 #개의 단어를 바꾼다.
#cc 현재 위치로부터 #개의 줄을 바꾼다.

찾기와 바꾸기

/expression expression에 부합하는 내용을 현재 위치 다음부터 찾는다.
?expression expression에 부합하는 내용을 현재 위치부터 위쪽으로 찾는다.
n 앞에서 찾은 내용을 현재 위치 다음부터 다시 찾는다. /에 의한 탐색이면
뒤에서 찾고, ?에 의한 탐색이면 앞에서 찾는다.
:n1,n2s/serch/replace/g
n1에서 n2라인까지 serch에 해당하는 문자열을 찾아, 그것을 replace
문자열로 바꾸어준다. 앞에 s가 그런 명령을 뜻하고, 뒤의 g는 묻지 않게
바꾸어주고 c로 바꾸어 쓴다면 바꿀지를 묻는다. 그때 바꾸려면 y를 치고
그렇지 않으면 다른 키를 치면 된다. n1과 n2대신에 .괴 +n을 사용하면 현재
라인부터 다음 n개의 라인까지 실행하라는 뜻이다.

기타

j 현재줄과 다음 줄을 합한다.
^g 현재 편집하고 있는 파일의 정보를 보여준다.
^l 화면을 다시 그린다.
u 방금 한 명령을 취소 한다.
U 현재 커서가 위치한 줄에 대한 편집 명령을 취소한다.
. 방금한 명령을 되풀이 한다.
#. 방금한 명령을 #번만큼 되풀이 한다.
ZZ 현재 내용을 저장하고 끝낸다.

ex란 초기 유닉스에서부터 쓰이던 line editor이다. vi는 자체의 명령어 외에
ex편집기 명령어를 지원한다. 명령모드에서 ‘:’를 누르면 화면 아래쪽에 ‘;’라는
프롬프트가 뜨면서 ex명령 모드로 들어간다.
다음은 ex명령 모드에서 쓰이는 명령이다.

:f ^g와 같다. 현재 라인의 정보를 보여준다.
:w 현재 내용을 저장한다.
:w filename 현재 내용을 지정된 파일 이름으로 저장한다.
:w! read-only로 된 파일에 강제로 덮어쓰기를 한다.
:wq 현재 내용을 저장하고 종료한다.
:q! 현재 내용을 저장하지 않고 종료한다.
:args 읽어들인 파일 이름들을 보여준다.
:e filename 새로운 파일을 편집한다. 여러 파일을 읽었을 때 자주 쓴다.
:r filename 현재 커서위치 다음에 파일을 읽어 삽입한다.
:14 r filename 14행 이후에 파일을 읽어 삽입한다.
:n1,n2d n1번째 행에서 n2번째 행까지를 지운다.
:n1,n2 w filename n1에서 n2행까지를 filename에 저장한다.
:3,$d 3번째 행에서 끝행까지 지운다.
:set 여러 가지 환경 변수를 설정한다. set all하면 현재 설정되어 있는 환경
변수를 보여준다.
:map key macro 정해준 키 입력이 들어왔을 때 매크로를 실행하도록 해준다.
명령 모드일때만 키 입력이 유효하다.
:map! key macro 위의 map과 같지만 차이는 map!은 삽입모드에서 키 입력에 따른
처리를 할 때 쓰인다는 점이다.

map은 키 입력에 따라 처리를 할 수 있도록 한다. key는 모든 키 입력을 쓸 수 있는데,
평션키나 리턴키 Esc키 같은 것들은 제어 기능을 없애기위해 ctl+V를 입력한 다음에
써야 한다는 것을 잊지말자. 다음과 같은 식이다.

:map ^[[28~ :wq^M
:map! ^[[28~ ^[:wq^M

위의 경우는 명령어 모드 상태일 때만 위의 키보드 입력에 대한 처리를 한다.
키 입력이 F1일 때 wq를 실행하려는 명령이다. (ctl+v, F1, :, w, q, ctl+V, 리턴).
아래의 경우는 입력 상태일 때만 매크로가 실행되는데 키보드 입력이 F1일 때 wq를
실행하고 끝낸다.(ctl+v, F1, ctl+V, esc, :, w, q, ctl+V, 리턴). map은 ~/.exrc에서
정해줄 수 있다. 이것으로 커서 이동이나 자신만의 편집 매크로를 만들 수 있다.
또 위에서 set 명령으로 여러 가지 환경 변수를 설정한더고 했는데, 이것을 ~/.exrc
안에 써 놓으면 vi가 시작될 때 디폴트로 설정되어 시작되게 된다. vi환경 변수의
설정은 ’set var’의 형식으로 설정하며 설정을 해제할 때는 ’set novar’의 형식으로
설정한다. 예를 들어 indentation을 설정하는 ’set autoindent’의 경우 설정을 해제할
때는 ’set noautoindent’로 쓴다.
다음은 중요한 vi환경 변수의 리스트이다.

set autoindent 자동으로 들여쓰기를 설정한다.
set ignorecase 문자열을 검색할 때 대, 소문자에 관계없이 검색한다.
set number 행의 앞에 행번호를 붙여 준다.
set showmatch ‘}’ 또는 ‘)’를 입력하였을 경우 짝이 되는 ‘{‘, ‘(‘를 찾아 커서가
1초동안 머무르다 돌아온다. 이 기능은 C등의 프로그램을 작성할 때
아주 편리하게 쓸 수 있다.
set showmode 화면 오른쪽 아래쪽에 현재 모드를 표시한다.

vi에는 이외에도 많은 명령들이 있다.
하지만 vi의 모든 것을 다 알고 쓰는 사람은 거의 없을 것이다.
아마도 vi를 처음 사용해 보는 사용자라면 이것들만 보고도 질려버릴 것이다.
처음부터 이러한 사항들을 다 알고 있을 필요는 없다. 사용하면서 text 파일을 편집할
경우가 아주 많이 있을 것이다. 기본적인 것만 일단 익히고 사용하면서 차차 배워 나가는
것이 좋을 것이다. 필자의 경험으로는 위의 사항 정도면 무리 없이 쓸 수 있을 것이고,
초보의 경우라면 일단 커서 이동 명령(h, j, k, l, ^f, ^b, #G)과 찾기(/expression),
입력(i, o, a), 지우기(dd, dw), 기본적인 ex 명령(:w, :wq, :q!)들만 익혀도 상당히 편하게 쓸 수 있다.

Tags: ,