'분류 전체보기'에 해당되는 글 304건

  1. 2008.08.01 스케쥴링 기법
  2. 2008.08.01 banker's algorithm 1
  3. 2008.08.01 deadlock
  4. 2008.08.01 jndi
  5. 2008.07.25 ant
  6. 2008.07.25 정규식
  7. 2008.07.25 tar
  8. 2008.07.25 명령어2
  9. 2008.07.25 명령어1
  10. 2008.07.25 검색 & 정규식

스케쥴링 기법

Algorithm 2008. 8. 1. 12:29

선점(preemptive)스케쥴링과 비선점(nonpreemptive)스케쥴링

 


가. 선점 스케쥴링

특정 프로세스가 중앙처리장치를 효율적으로 사용할 수 없는 시점에 이를 때마다 중 앙처리장치의 사용권이 다른 프로세스로 옮겨지는 방식으로 높은 우선순위의 프로세 스들이 급하게 실행해야 할 경우에 유용하다.

① 대화식 시분할 시스템에서 빠른 응답시간을 유지하는 데에 필요하다.

② 경비가 많이 들고 오버헤드까지 초래한다.

③ 효과적인 선점을 하려면 준비 상태의 프로세스가 많아야한다.

④ 우선순위를 고려해야 한다.

⑤ 문맥교환의 횟수가 비선점 방식에 비해서 많다.

 


나. 비선점 스케쥴링

어떤 자원이 어떤 프로세스에 할당이 되면 실행을 종료할 때까지 그 프로세스가 중앙처 리장치의 사용권을 독점하여 사용하는 것으로 짧은 작업들을 기다리게 되는 경우가 있 지만 모든 프로세스 관리에 공정하다.

① 응답시간의 예측이 쉽다.

② 문맥교환의 횟수가 적다.

③ 일괄처리 방식에 적합한 방식이다.

참조) 우선순위(Priority)

① 정적 우선순위(static priority): 프로세스 실행중 우선순위가 변하지 않는 것으로 구현이 용이하고 동적 우선순위에 비해 오버헤드가 적다.

② 동적 우선순위(dynamic priority): 처음에 정해진 우선순위를 상황에 맞게 계속조정하여 사용하므로 구현이 복잡하고 정적 우선순위에 비해 오버헤드가 크다.

 

 

 

프로세서 스케쥴링의 종류

 


선점( Preemption)

 


1. RR (Round Robin )

① FIFO스케쥴링과 같이 도착 순으로 디스패치되는 방식

② 타임 슬라이스(time slice) 혹은 시간 할당량(time quantum)에 의해 시간제한을 받음

시간할당량이 클 경우 : FIFO스케쥴링 방법과 차이가 없게 됨

시간할당량이 적은 경우 : 문맥교환 오버헤드가 상대적으로 커지게 되어 시스템은 대부분의 시간을 문맥교환(context switching)에 소비하게 됨

③ 대화식으로 사용하는 시분할 시스템에 적합

④ FIFO를 선점 스케쥴링으로 변형시킨 방법

 


2. SRT (Shortest Remaing Time)

① SJF스케쥴링기법을 선점 기법으로 변형시킨 방법

② 시분할 시스템에 유용하다.

③ 작업이 끝나기까지 남아 있는 실행시간의 추정치가 가장 작은 프로세스를 먼저 실행함

④ SJF스케쥴링기법보다 오버헤드가 큼

 


3. Multilevel Feedback Queue

① 짧은 작업에 우선권

② 입출력 위주의 작업들에게 우선권

③ 큐에서 FIFO 형태로 이동

(마지막 단계의 큐에서는 프로세스가 종료될 때까지 RR방식으로 순환)

④ 낮은 단계로 내려갈수록 프로세스의 시간 할당량이 커짐

 

 

 

비선점 ( Non - preemption )

 


1. FIFO ( First In First Out )

① 준비 큐(ready queue)에서 도착한 순서에 따라 디스패치 됨

② 응답시간 차가 적기 때문에 예측이 쉬움

③ 대화식 시스템에는 적합하지 않음

 


2. SJF ( Shortest Job First )

① 작업이 끝나기까지의 실행시간의 추정치가 가장 적은 작업을 먼저 실행 함 (짧은 작업들에 우선적으로 서비스)

② 평균 대기시간을 최소화 시킬수 있음

 


3. 우선순위 ( Priority )

① 각 프로세스에게 우선순위를 부여하여 우선순위가 높은 순서대로 처리함

② 우선순위가 같을 때는 FIFO또는 SJF을 도입하여 실행 함

 


4. 기한부 ( Deadline Scheduling )

작업들을 마감시간까지 완성하도록 계획한 스케쥴링

 


5. HRN ( Highest Response Ratio Next )

① SJF스케쥴링기법의 약점인 긴 작업과 짧은 작업간의 지나친 불평등들을 어느 정도 보완한 방법

② 각 작업의 우선순위는 그 작업이 서비스를 받을 시간뿐 아니라 그 작업이 서비스를 기다린 시간 두 가지의 함수로 결정됨

응답률 = (대기한 시간 서비스 받을 시간)/ 서비스 받을 시간

  

 

'Algorithm' 카테고리의 다른 글

deadlock 4가지  (0) 2008.08.01
B-, B+ Tree  (0) 2008.08.01
CPU scheduling  (0) 2008.08.01
banker's algorithm  (1) 2008.08.01
deadlock  (0) 2008.08.01
Posted by 으랏차
,

banker's algorithm

Algorithm 2008. 8. 1. 12:07

▶ 교착상태 회피(Deadlock Avoidance) - 은행원 알고리즘 (banker's algorithm)

- Multiple instances
- Each process must a priori claim maximum use
- When a process requests a resource it may have to wait
- When a process gets all its resources it must return them in a finite amount of time

 

- Data Structures for the Banker’s Algorithm (n: 프로세서의 수, m : 자원의 종류수)

- Available  : 사용가능한 자원의 수 , Available[j] = k : 자원종류 Rj k 사용가능

 

- Max : 프로세스의 최대 요구 ( n x m 행렬 ), Max[i,j] = k : Pi 자원종류 Rj 최대 k 요청
 
- Allocation : 프로세스에 할당된 자원의 ( n x m 행렬 ), Allocation[i,j] = k : Pi 현재 자원종류 Rj k 할당 받고 있음
 
                      Note : X[i] <= Y[i] for all i=1,2,..n 이면 X<=Y
 
- Need : 프로세스의 남은 요구 ( n x m 행렬 ), Need[i,j] = Max[i,j] - Allocation[i,j] = k : Pi 자원종류 Rj k 요구함

+ Safety Algorithm

1. Let Work and Finish be vectors of length m and n, respectively. Initialize :  Work := Available
                                                                                       Finish [i] := false for i = 1,2, …, n
2. Find an i such that both :    (a) Finish [i] = false
                                  (b) Needi ≤ Work
                                   If no such i exists, go to step 4
3. Work := Work + Allocation(i)
   Finish[i] := true
   go to step 2


4. If Finish [i] = true for all i, then the system is in a safe state.


 Exercise ( A, B, C, D 는 시스템에 존재하는 자원을, P0, P1, P2, P3, P4는 프로세스를 표시한다.)

 

 

Allocation

Max

Available

 

A

B

C

D

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

1

5

2

0

P1

1

0

0

0

1

7

5

0

 

 

 

 

P2

1

3

5

4

2

3

5

6

 

 

 

 

P3

0

6

3

2

0

6

5

2

 

 

 

 

P4

0

0

1

4

0

6

5

6

 

 

 

 

       

 

 

 

1) Need 행렬의 내용 ( 각 프로세스의 자원요구 필요량)

         

         Need 행렬의 값은 ( Max - Allocation)으로부터 얻어진다. (아래의 표 참고)

2) 안전 상태(safe state)의 정의와 위 시스템의 안전 상태 여부

ㅁ 안전 상태(safe state)

     - 일련의 순서대로 자원할당해도 교착상태 없는 상태

     - safe  sequence 있는 상태
     - 시스템 상태가 'safe' 하다는 말은 시스템이 어떤 순서로든 프로세스들이 요청하는 모든 자원을 (설사 최대치를 요구하더라도)
       deadlock을 야기시키지 않고 차례로 모두 할당해 줄 수 있다는 것을 뜻한다.
        즉, 시스템이 safe sequence를 찾을 수 있다며 시스템은 safe 하다고 말한다. 
ㅁ 시스템이 안전 상태에 있는 지 알아보기 위해 safety algorithm 을 적용해본다.
 
          1) 초기상태 (n = 5, m = 4)
 Work := Available = (1, 5, 2, 0)
 Finish [i] := false for i = 1,2, …,5

 

Allocation

Max

Need

Available

 

A

B

C

D

A

B

C

D

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

0

0

0

0

1

5

2

0

P1

1

0

0

0

1

7

5

0

0

7

5

0

 

 

 

 

P2

1

3

5

4

2

3

5

6

1

0

0

2

 

 

 

 

P3

0

6

3

2

0

6

5

2

0

0

2

0

 

 

 

 

P4

0

0

1

4

0

6

5

6

0

6

4

2

 

 

 

 

 
2) - Finish[i] = false and Needi ≤ Work,  If no such i exists, go to step 4
                  i = 1 ; Finish[1] = false & Need1(0, 0, 0, 0) ≤ Work (1, 5, 2, 0) → 성립
    - Work := Work + Allocation(i), Finish[i] := true, go to step 2
                  Work := Work (1, 5, 2, 0) + Allocation1(0, 0, 1, 2) = (1, 5, 3, 2)
                  Finish[1] := true, go to step 2
 

 

Allocation

Max

Need

Available

 

A

B

C

D

A

B

C

D

A

B

C

D

A

B

C

D

P0

0

0

0

0

0

0

0

0

0

0

0

0

1

5

3

2

P1

1

0

0

0

1

7

5

0

0

7

5

0

 

 

 

 

P2

1

3

5

4

2

3

5

6

1

0

0

2

 

 

 

 

P3

0

6

3

2

0

6

5

2

0

0

2

0

 

 

 

 

P4

0

0

1

4

0

6

5

6

0

6

4

2

 

 

 

 

 
 
3) 이렇게 적용해보면, 결과는  <P0, P2, P1, P3, P4>순서로 진행되어 safety requirement가 된다.

 

Allocation

Max

Need

Available

 

A

B

C

D

A

B

C

D

A

B

C

D

A

B

C

D

P0

0

0

0

0

0

0

0

0

0

0

0

0

 

 

 

 

P1

0

0

0

0

0

0

0

0

0

0

0

0

 

 

 

 

P2

0

0

0

0

0

0

0

0

0

0

0

0

 

 

 

 

P3

0

0

0

0

0

0

0

0

0

0

0

0

 

 

 

 

P4

0

0

0

0

0

0

0

0

0

0

0

0

3

14

12

12

 

3) 프로세스 P1이 (0, 4, 2, 0)의 자원 요청시, 그 요청의 수용여

ㅁ Request1  ≤ Available ; Request1(0, 4, 2, 0)  ≤ Available(1, 5, 2, 0) → 성립

 

 

Allocation

Max

Need

Available

 

A

B

C

D

A

B

C

D

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

0

0

0

0

1

1

0

0

P1

1

4

2

0

1

7

5

0

0

3

3

0

 

 

 

 

P2

1

3

5

4

2

3

5

6

1

0

0

2

 

 

 

 

P3

0

6

3

2

0

6

5

2

0

0

2

0

 

 

 

 

P4

0

0

1

4

0

6

5

6

0

6

4

2

 

 

 

 

 

ㅁ 요청시 P1의 Allocation  := P1의 Allocation +  Request1(0, 4, 2, 0) = (1, 4, 2, 0)

ㅁ 요청시 P1의 Need  := P1의 Need - 요청시 P1의 Allocation = (0, 3, 3, 0)

ㅁ 요청시 Available  := Available -  Request1(0, 4, 2, 0) = (1, 1, 0, 0)

 

safety algorithm 을 적용해보면, <P0, P2, P1, P3, P4>순서로 진행되어 safety requirement가 된다.

    P1의 자원 요청은 그 즉시 수용하지는 못하나, 중간 정도에 수용요청을 들어줄 수 있다.

 

4) 은행원 알고리즘과 교착상태 방지(prevention)

ㅁ 은행원 알고리즘은 교착상태 회피(avoidance) 알고리즘이다. 교착상태를 회피하는 것은 사용자(프로세스)가 자원이 어떻게 요청될 지에 대한 추가 정보를 제공하도록 요청하는 것이다. 은행원 알고리즘은 프로세스가 시작할 때 프로세스가 가지고 있어야 할 자원의 최대 개수를 자원 종류마다 신고하여야 한다. 또한, 교착상태 회피 알고리즘은 시스템에 순환 대기 상황이 발생하지 않도록 자원 할당 상태(가용 자원의 수, 할당된 자원의 수, 프로세스들의 최대 요구 수)를 검사한다. 이에 반해 교착상태 방지(prevention)는 요청방법을 제약하여 교착상태를 예방하는 것인데, 교착상태가 발생할 때 필요한 네 가지의 필요 조건 중 최소한 하나가 성립하지 않도록 보장함으로써 교착상태의 발생을 예방한다.

 하지만, 교착 상태 방지(prevention)는 지나치게 제한적이며, 교착상태 회피(avoidance)도 흔하게 유효하지 않는 정보를 요구할 수 있다.

 

5) 은행원 알고리즘을 분산시스템에서 사용하는 방법 및 문제점

ㅁ 교착 상태 방지와 회피 알고리즘들을 약간 수정하면 분산 시스템에서도 사용될 수 있다. 예를 들면, 시스템 내의 스로세스 중 하나를 은행원 알고리즘을 수행하는 데 필요한 정보를 유지하는 프로세스(은행원)로 지정함으로써 은행원 알고리즘을 분산 시스템에 사용할 수 있다.

다만, 은행원 알고리즘은 쉽게 구현될 수 있지만, 추가 비용이 너무 크다. 은행원에게 오고 가는 메시지가 너무 많기 때문에 은행원이 병목(bottleneck)이 될 수 있다.

'Algorithm' 카테고리의 다른 글

deadlock 4가지  (0) 2008.08.01
B-, B+ Tree  (0) 2008.08.01
CPU scheduling  (0) 2008.08.01
스케쥴링 기법  (0) 2008.08.01
deadlock  (0) 2008.08.01
Posted by 으랏차
,

deadlock

Algorithm 2008. 8. 1. 12:06

Deadlock의 4대 조건.


1. Mutual Exclusion

2. Hold and Wait

3. No Preemtion

4. Circular Wait


조건이 만족 됐을 때 Deadlock, 즉 교착상태에 빠지게 된다.


Deadlock 상태를 깨 부수기 위해서는 원인을 찾고, 그거에 맞는 대처 방법을 쓰면 된다.


이는 프로그래밍을 하는 사람이나, OS를 공부한 사람은 다 알고 있는 내용이다. 기본적인 내용이기도 하고.


OS 상태에서는 Deadlock에 대한 솔루션이 이미 나와있다. 그런데 현실세계는 어떠한가.


현재 나라가 돌아가는 모습이나 기타 다른 곳에서 돌아가는 것을 보면 교착상태에 빠진것 같다는 생각을 하곤 한다. 2개 아니 그 이상이 맞물려서 물러섬 없이 버티니깐 오도 가도 못하는 상태가 되는 것.


가장 화끈한건, 하나를 없애버리는 것이다. 그러면 방해물이 사라져서 잘 뚫릴테니깐. 그런데 현실성은 0이다. 쿠데타가 일어나지 않는 이상 이와 같은 일이 일어날 수가 있겠는가.


OS가 아닌 다른 곳에서의 교착상태에 대한 솔루션이 절실한 때가 아닌가 싶다. 그래야 교착상태를 해결하고 막힘 없이 잘 돌아갈 테니깐. 사회를 재부팅 할 수도 없는 노릇이고, 어서 잘 해결되기를 바랄 뿐이다. 그래야 다들 살아남을 수 있을테니깐.

 

'Algorithm' 카테고리의 다른 글

deadlock 4가지  (0) 2008.08.01
B-, B+ Tree  (0) 2008.08.01
CPU scheduling  (0) 2008.08.01
스케쥴링 기법  (0) 2008.08.01
banker's algorithm  (1) 2008.08.01
Posted by 으랏차
,

jndi

dev 2008. 8. 1. 11:56

JNDI의 소개

많은 J2EE개발자들이 환경 변수(environment entries), DataSource 객체, JMS 메시지 수신지(JMS message destinations) 그리고 엔터프라이즈 빈 홈 인터페이스(enterprise bean home interfaces)를 찾고자 Java Naming and Directory Interface (JNDI)를 이용한다. 하지만 많은 사람들은 JNDI에 대한 진정한 이해 없이 이러한 기능을 하는 코드를 단순히 복사해서 붙이고 고칠 뿐이다. 이 팁은 사용자의 엔터프라이즈 시스템에 배포된 리소스를 액세스하기 위해 JNDI를 사용하는 방법을 소개한다.

엔터프라이즈 애플리케이션들은 그것들의 특성상, 비즈니스 오퍼레이션을 지원하기 위해 여러곳에 배포된 리소스들을 한데 모아야 한다. 새로운 시스템이 생성되었다거나, 기존의 시스템이 업그레이드 되었다거나, 오래된 시스템이 더 이상 작동하지 않을 때 서비스들이 오가게 된다. 애플리케이션 서비스를 서로 분리하는 것은 시스템을 쉽게 유지/확장할 수 있게 한다. 하지만 서비스가 분리되었을 때, 각자의 역할을 제대로 수행하기 위해서는 서로를 찾아낼 수 있어야만 한다. 이 때가 바로 명명 서비스(naming services)와 디렉토리가 유용한 시점이다.

명명 서비스는 이름을 이용해서 객체나 객체에 대한 레퍼런스를 검색하는 방법을 제공한다. 그러한 객체로의 예는 메시지 큐(message queues), 데이터베이스 커넥션 팩토리(database connection factories), 환경 파라미터(environment parameters), 그리고 엔터프라이즈 빈과 같은 분산 컴포넌트(distributed components)등이 있다. 애플리케이션 개발자들은 명명 서비스내의 이름에 객체들을 바인딩해서 객체에 이름을 붙인다. 애플리케이션 코드는 이렇게 바인딩된 이름으로 객체들을 검색하기 위해 명명 서비스를 사용할 수가 있다. 이러한 분리(decoupling)는 네트워크 객체들을 사용하는 시스템 컴포넌트에 대한 어떠한 변경없이 유지 보수를 위해 올리거나 내릴 수 있고, 요청들을 리다이렉트(redirect)시킬 수 있으며, 서비스가 다이나믹하게 재조정될 수 있음을 의미한다.

이미 기존의 명명 서비스에 대해 잘 이해하고 있으리라고 생각된다.

  • DNS (Domain Name Service)는 java.sun.com과 같은 호스트네임을 %nslookup java.sun.com%과 같은 IP주로소 매핑한다.
  • CORBA (Common Object Request Broker Architecture)를 위해 쓰이는 COS (Common Object Services) 명명 서비스 는 CORBA 인터페이스 이름(interface names)을 객체 인터페이스로 매핑한다.

사용자는 컴퓨터의 파일시스템을 파일의 경로(pathname)에 파일의 컨텐츠를 매핑하는 일종의 명명 서비스로 생각할 수 있다.

밑의 그림은 명명 서비스가 서비스 네임을 데이터나 서비스 인터페이스로 매핑하는 방법을 보여주고 있다.

figure 1

이름(name)을 객체로 매핑하는 것을 바인딩이라 부른다. 바인딩은 명명 서비스를 형성하는 사람에 의해 생성된다. 대부분의 명명 서비스는 프로그램이 런타임시에 이름을 객체로 바인딩하거나 해제하는 방법도 제공한다.

컨텍스트는 이름을 객체로 바인딩한 집합이다. 예를 들면, 파일시스템에서 경로 /home 는 흔히 시스템의 유저 디렉토리를 포함하는 컨텍스트이다. 컨텍스트는 다른 컨텍스트를 포함할 수도 있다. /home 컨텍스트의 유저 디렉토리는 그 자체가 유저 파일을 포함하는 컨텍스트이다.

컨텍스트는 최소한 명명 규칙(naming convention)과 검색기능(lookup function)을 갖는다. 예를 들면, DNS는 가장 구체적인 스트링은 왼쪽, 도메인은 오른쪽에 나타내면서 스트링을 점으로 분리하는 명명 규칙을 갖는다. DNS의 검색기능은 nslookup 프로그램을 이용해서 커맨드라인으로부터 액세스가 가능하다.(물론, DNS 명명 서비스에 대한 API도 존재한다.) 컨텍스트는 대게 객체들을 바인딩하고 해제하는 방법과 그것들을 열거하는 방법을 제공한다.

때때로 명명 서비스 의 객체들은 다른 프로그램이 필요로 하는 데이터를 포함한다. 가령, J2EE애플리케이션에서 환경 변수를 나타내는 객체들은 대게 명명 서비스 에 저장된다. 하지만 이외에 명명 서비스의 객체는 객체에 대한 레퍼런스를 나타낸다. 예를 들면, 서버에 레퍼런스를 제공하는 객체는 통상적으로 오픈 서버 커넥션이 아닌 서버에 대한 레퍼런스로서 명명 서비스 에 의해 저장된다.명명 서비스 에 의해 리턴된 레퍼런스 객체는 필요시에 서버 커넥션을 생성하기 위해 사용될 수 있다.

다음 그림은 컨텍스트의 개념도이다. top 컨텍스트는 /top로 불리며 객체, 레퍼런스, 그리고 다른 컨텍스트들을 포함한다. 컨텍스트 /top은 subcontexts b 와 g를 갖는다. 컨텍스트 /top/g 는 subcontext "b"를 갖는다. A라고 불리는 객체가 하나 이상 일지라도, 특정 개체 /top/g/b/a는 그 위치가 컨텍스트 /top/g/b 임이 분명하기 때문에 찾을 수가 있다.

figure 2

바인딩된 객체들에 대한 데이터를 제공하는 명명 서비스를 디렉토리라고 부른다. 가령, 파일시스템 디렉토리는 일반적으로 크기, 타입, 접근 허용 그리고 파일을 생성하고 수정한 날짜에 관한 정보를 제공한다. 몇몇 디렉토리는 이름으로 검색, 애트리뷰트의 조합으로 검색 모두를 허용한다.

각각의 명명 서비스들은 각자의 태스크(task)에 잘 맞도록 되어있지만, 그들이 작동하는 방식은 서로 다르다. 각 명명 서비스는 고유의 명명규칙, 검색기능, 바인딩과 디렉토리 프로토콜(directory protocols)과 객체 서비스 인터페이스(object service interfaces)를 갖는다. JNDI 는 네트워크 서비스를 이름짓고 찾기 위해 일관된 방법을 제공한다.

Java Naming and Directory Interface

JDBC 데이터베이스 커넥션(database connections), JMS 큐(JMS queues) 혹은 엔터프라이즈 빈 홈 인터페이스(enterprise bean home interfaces)와 같은 네트워크 객체에 액세스하기 위해 JNDI 를 사용하는 방법을 이미 알고 있을 것이다. 사실 JNDI 는 이름들을 객체로 매핑하지만, JNDI 는 명명 서비스가 아니다. 그보다도 JNDI는 명명 서비스를 표준적인 방법으로 액세스가능하게 하면서 기존의 명명 서비스를 감추는(wrap) 인터페이스들의 집합이다.

다음 그림에서 보는 것과 같이, 자바 애플리케이션은 JNDI인터페이스를 이용해서 감춰진(underlying) 명명 서비스에 액세스한다.

figure 3

애플리케이션내의 코드는 JNDI 인터페이스 메소드를 호출한다. 이러한 메소드를 구현하는 객체들은 JNDI 인터페이스 호출을 감춰진 명명 서비스에 대한 호출로 매핑한다. 또한 JNDI는 통합된 명명 규칙도 정의한다. JNDI 이름들은 JNDI의 명명 관리자(naming manager)에 의해 감춰진 명명 서비스의 명명 규칙을 따르는 이름으로 매핑된다.

javax.naming 패키지는 다음과 같은 명명과 디렉토리에 관련된 인터페이스들을 포함한다.

  • javax.naming.Context는 컨텍스트를 나타내는데, 이것은 바인딩과 서브컨텍스트를 찾고 관리하는 데에 쓰인다.
  • javax.naming.Name는 명명 서비스의 이름을 추상적으로 표현(abstract representation)하게 해준다.
  • javax.naming.Binding은 명명 서비스 이름과 그 이름에 바인딩된 객체의 표현이다.
  • javax.naming.Reference는 객체의 복사본을 얻어낼 수 있게 해준다.

컨텍스트 찾기

이 팁에 포함된 샘플코드는 JNDI컨텍스트의 컨텐츠를 열거하는 방법을 보여준다. 샘플 서블릿 Oct2003Servlet는 사용자가 입력한 이름에 해당하는 JNDI namespace내의 컨텐츠를 찾고 디스플레이한다.

컨텍스트를 얻는 가장 쉬운 방법은 javax.naming.InitialContext 클래스의 인스턴스를 생성하는 것이다. 샘플 서블릿 메소드 jndiList 는 최초의 컨텍스트를 생성하고 명명된 객체를 찾을 때 그것을 사용한다.

   InitialContext ic = new InitialContext();
   Object objFound = ic.lookup(name);

여기에서 name은 사용자가 HTML페이지에서 입력한 HTTP GET 혹은 POST 변수명(vriable name)이다. 만약 리턴된 객체가 Context 라면 jndiListlistContext 메소드를 호출하고, ListContext메소드는 주어진 이름에 해당하는 컨텍스트의 컨텐츠를 열거한다. 객체가 DataSource이면, jndiList 는 명명된 데이터 소스에 관한 정보를 출력한다.

listContext 메소드는 주어진 JNDI 컨텍스트의 컨텐츠를 하나의 테이블로 출력한다. 이를 위해서는 Context 메소드 listBindings 를 이용하는데, 이는 NamingEnumeration 를 리턴한다.

      NamingEnumeration ne = context.listBindings("");

NamingEnumerationjava.util.Enumeration를 구현한 것이다. NamingEnumeration.next 메소드는 javax.naming.Binding 타입의 객체를 리턴하고, 이는 객체의 이름과 객체의 클래스 이름 그리고 저장된 객체 자체를 포함한다.

      
      while (ne.hasMore()) {
         Binding ncp = (Binding)ne.next();
         String objName = ncp.getName();
         String objClass = ncp.getClassName();
         Object objObj = ncp.getObject();

         ...
     }

단순히 Context내의 이름들과 클래스이름을 보고자 한다면 Context.list 메소드를 이용할 수 있다. Context.listNamingEnumeration를 리턴하지만, 그것이 담고있는 컬랙션은 Binding이 아닌 NameClassPair 타입이다. NameClassPair는 이름과 객체 클래스 이름만을 포함한다.

샘플애플리케이션을 배포하고 실행하는 방법은 샘플코드 실행하기 를 참고한다.

애플리케이션을 실행하면, 다음과 같은 시작페이지를 보게 된다.

jndichoice

컨텍스트를 입력하거나, 텍스트 필드를 빈 상태로 놔두고 명명된 컨텍스트의 컨텐츠를 보기 위해 List버튼을 클릭한다. 예를 들면 jdbc 의 엔트리는 다음과 같은 화면을 디스플레이한다.

jndilist

JNDI 에 관한 더 자세한 정보는 JNDI 튜토리얼를 참고한다.

 

'dev' 카테고리의 다른 글

script class  (0) 2008.08.01
정규화  (0) 2008.08.01
ant  (0) 2008.07.25
정규식  (0) 2008.07.25
검색 & 정규식  (0) 2008.07.25
Posted by 으랏차
,

ant

dev 2008. 7. 25. 15:43

ANT

작성자 : 진은영 ( 2004-08-02)

[메인] [목록]

목차

8.2.1 ANT 개요

① ANT란
자바로 개발을 하다보면 외부에서 jar파일을 가져와서 사용해야 할 때가 있을 것이다. 대표적으로 JDBC드라이버, servlet.jar 등이 있다. 이러한 패키지를 가져다 쓰려면 환경변수에 추가하거나 , 도스상에서 컴파일 혹은 실행할때 클래스패스를 나열하고 실행해야 한다. 패키지들이 많거나 매번 추가해야할 경우에는 굉장히 불편할 것을 느낄것이다.

Ant와 같은 빌드 도구를 사용하지 않을 경우 도스 창에서 클래스 패스에 클래스를 추가하거나 소스 파일 컴파일, jar 파일로 묶는 작업, 묶은 jar 파일을 특정 디렉토리로 이동시키고 수정된 내용을 javadoc으로 문서화 시키는 등의 작업은 소스가 수정될 때마다 한 단계씩 도스 창에서 모두 입력해야 한다. 하지만 Ant를 사용하면 마치 배치(bat) 파일을 실행한 것처럼 이와 같은 일련의 작업들을 Ant를 이용하여 단 한번에 수행할 수 있다.


② ANT의 주요 기능
Ant의 주요 기능을 알기 쉽게 몇 가지만 나열해 보면 아래와 같다.

  • 자바 소스 파일 컴파일(너무 당연하다)
  • jar, war, ear, zip 파일의 생성
  • javadoc을 실행하여 도움말 생성
  • 파일이나 폴더의 이동 및 복사, 삭제
  • 각각의 작업에 대한 의존성 설정
  • 유닉스에서처럼 파일이나 폴더에 퍼미션 설정
  • 파일의 변경 날짜를 설정하는 touch 기능
  • 외부 프로그램의 실행



8.2.2 ANT 설치

아래의 위치에서 파일을 다운로드 받는다.
위치 : http://ant.apache.org/bindownload.cgi 파일 : apache-ant-1.6.2-bin.zip

원하는 장소에 압축을 풀면 아래와 같은 폴더가 나타난다. (필자는 apache-ant-1.6.1-bin.zip로 다운받았다)

ANT를 사용하기 위해서는, 클래스 패스에 apache-ant-1.6.1을 포함해야 한다. 아래의 내용을 확인하면 추가하는 방법을 알 수 있다.
바탕화면 - 내컴퓨터 오른쪽버튼 클릭 - 등록정보 - 고급 - 환경변수를 클릭한다.



새로 만들기 버튼을 클릭하여 ANT의 폴더를 등록한다.



ANT를 실행하기 위해 path환경변수를 선택한 후 편집단추를 클릭하여 ANT의 bin폴더를 path에 등록한다.



등록하는 방법은 Log4J의 환경변수 추가와 유사하다.


8.2.3 ANT 구조

① 빌드 파일 구조
ANT는 프로젝트의 빌드, 테스트 , 배치등의 모든 단계를 어떻게 수행할지 명시하기 위하여 XML파일을 사용한다. 이 XML파일을 빌드 파일이라 하며, ANT를 사용하는 모든 프로젝트들은 적어도 하나 이상의 빌드파일을 가지고 있어야 한다.
ANT가 사용한느 디폴트 빌드 파일명은 build.xml이다.


ANT 빌드 파일의 루트 엘리먼트는 < project />이다. < project /> 하위에는 빌드 과정에서 사용할 속성을 정의할 수 있는 < property /> 엘리먼트와 각 Task에서 사용할 경로 정보를 포함하는 < path />엘리먼트 , 실질적인 작업을 수행하는 < target />엘리먼트를 가진다.
    < project name=“projectName” default=“first” basedir=“.”>
    • name : 프로젝트 이름
    • default : 초기치로 설정되는 작업(Task), 아무 것도 지정하지 않고 실행하면 이 작업을 수행
    • basedir : 프로젝트에 대한 기준 폴더를 지정한다. .은 현재폴더를 지정한다.

    < property name="src.dir" value="${basedir}/src“ />
    < property name="classes.dir" value="${basedir}/classes" />
    property는 변수를 지정하는거과 같다.
    • name : 변수명
    • value : 변수값
    변수를 호출할 때 ${변수명} 으로 사용한다.

    < target name="compile" >
       < javac srcdir="${src.dir}" destdir="${classes.dir}" />
    < /target>
    • name : target의 이름을 지정한다.
      나중에 build 할때 이 이름으로 호출할 수 있다.
    • 자바소스를 컴파일할 때 어디에 있는 무엇을 어디에 컴파일하는가를 지정한다.
      srcdir : 자바소스가 들어있는 폴더를 지정한다.
      destdir : 컴파일한 후 클래스파일이 위치할 폴더를 지정한다.



8.2.4 ANT 사용

① 웹애플리케이션
6-1강좌에서 사용한 웹 애플리케이션을 이용한다.


② build.xml
build.xml 파일은 WEB-INF에 생성한다.
<?xml version=“1.0” encoding="euc-kr"?>

<project name=“projectName”  default=“compile”   basedir=“.”>

    <property name="src.dir" value="${basedir}/src“  /> 
    <property name="classes.dir" value="${basedir}/classes" /> 

     <target name="compile" > 
         <javac srcdir="${src.dir}" destdir="${classes.dir}" /> 
    </target> 
</project>  


③ 자바문서 생성
자바문서는 src 폴더 안에 생성한다.
package kr.co.a ;

public class ANTTest {
	public static void main( String [] args ){
		System.out.println( "test" ) ; 
	}
}


④ 도스모드에서 컴파일
도스 창을 띄운 후 현 컨텍스트의 WEB-INF 폴더를 이동한다.
그냥 컴파일을 하면 현재 폴더안에 패키지가 생기면서 컴파일이 된다.


⑤ ant를 실행한다.
E:\03.src\jslt\WEB-INF>ant

ant를 실행하면 현재 폴더에 있는 build.xml 문서를 호출해서 project에 default로 선언되어 있는 task를 호출한다. 여기에서는 compile task를 호출한다.


⑦ 탐색기를 띄워 확인한다.
탐색기를 띄워 build.xml에 선언되어 있는것처럼 classes폴더에 가보면 컴파일 한 클래스가 해당 패키지 밑에 있는것을 확인할 수 있다.

이렇듯 build.xml문서만 잘 만들어 놓으면 컴파일을 수월하게 할 수 있다. 이외에도 굉장히 많은 내용들이 있지만 여러분들이 아래 참고문허을 살펴보며 추가해 보자. 혹시, 나중에 좀더 내용을 추가할 기회가 올지도...

참고문헌

 

'dev' 카테고리의 다른 글

정규화  (0) 2008.08.01
jndi  (0) 2008.08.01
정규식  (0) 2008.07.25
검색 & 정규식  (0) 2008.07.25
tomcat  (0) 2008.07.25
Posted by 으랏차
,

정규식

dev 2008. 7. 25. 15:34
Regular Expression(정규 표현식)
정규 표현식이란, 문자열에서 특정한 캐릭터 조합(character combination)을 찾아내기위한 패턴(pattern)입니다.
쉽게 문장에서 특정한 단어를 찾아내는 것이라고 생각하시면 될 것 같습니다
그렇기 때문에 정규 표현식 함수라고 불리는 것들은 대부분 문자열과 관련하여 특정 변수로 저장된 문자열 내에서 지정한 문자를 찾아내는 기능들을 수행합니다.
일반적으로 - 어느 랭귀지를 사용하던지 간에 - 정규 표현식을 구성하는 방법은 일반적인 문자열과 특정한 의미를 지니는 메타문자를 조합하는 것입니다.

JavaScript에서 정규 표현식은 1.2 버젼부터 사용가능하도록 추가되었습니다. 즉 그 이하버젼에서는 사용하지 못한다는 말이므로 아주 오래된 고려적 웹브라우저를 사용하시는 분들은 절대로 볼수가 없습니다. -_-;;
자바스크립트 객체부에서는 언급을 하지 않고 있지만, 정규표현식은 객체(objects)입니다.
정규 표현식의 패턴(pattern)은 object initializers(예, /abc/) 또는 RegExp constructor function(예, re = new RegExp("abc")로 표현할수 있습니다.
이러한 패턴들은 정규표현식의 exec, method 메소드(method)나 String 객체의 match, replace, search, split 메소드에서 함께 사용됩니다.

Regular Expression(정규 표현식) 생성
1. object initializers를 사용한 방법

re = /ab+c/

2. RegExp 객체의 constructor function를 사용한 방법

re = new RegExp("ab+c")

Regular Expression(정규 표현식) 쓰기
정규 표현식 패턴은 /abc/ 같은 단순한 캐릭터나 /ab*c/ ,/Chapter (\d+)\.\d*/ 와 같은 단순 캐릭터와 특별한 캐릭터의 조합으로 나타낼수 있습니다.
다음에 정규 표현식에 사용하는 특수 문자들에 대한 표를 나타내었지만, 이 외에도 상당히 많은 내용들이 있습니다.
타 사이트나 책을 참고로 하여 보시기 바랍니다.

정규 표현식에서 사용하는 Special characters

Character

의미

\

\ 다음에 나오는 특수 문자를 문자열로 인식
가령, /라는 특수문자는 일반적으로 프로그램상에서 나누기로 인식하게 되어있습니다. 이것을 나누기가 아닌 그냥 문자열 / 로 인식시키려면 \/ 로 써주면됩니다.

^

라인의 처음과 패턴과 매치
가령, ^A 라고 써주면 검색하고자 하는 문장의 시작문자가 A인지를 검사하는 것입니다.

$

라인의 끝과 패턴과 매치
가령, ^A 라고 써주면 검색하고자 하는 문장의 마지막문자가 A인지를 검사하는 것입니다.

*

0개 이상의 문자와 매치(모든것이라는 의미)

+

1개 이상의 문자와 매치, {1,}와 같은 의미임.

?

0 또는 1개의 문자 의미.
즉, A?b 라면 A라는 문자와 b라는 문자사이에 문자가 0개 또는 1개 가 들어갈 수 있다는 말입니다. 즉, Ab, Aab, Acb등과 같은..

.

1개의 문자와 일치

()

한번 match를 수행해서 나온 결과를 기억함.
예: /(foo)/ 는 foo라는 단어를 검색한 후, 그 단어를 배열등과 같은 저장장소에 남겨두어 나중에 다시 호출할 수 있도록 합니다.

|

OR

{n}

정확히 n개의 문자
예: a{2} 는 a 문자 두 개, 즉, aa를 의미합니다.

{n,}

n개 이상의 문자

{n,m}

n이상 m이하의 문자

[xyz]

문자들의 set를 의미. 가령, [a-z]라면 a부터 z까지의 모든 문자와 매치하는 것으로 []안의 -는 범위를 나타냅니다.

[^xyz]

네가티브(-) 캐릭터 셋

[\b]

백스페이스와 매치

\b

단어의 시작 또는 끝에서 빈 문자열과 매치

\B

단어의 시작 또는 끝이 아닌 곳에서의 빈 문자열과 매치

\cX

control 문자와 매치

\d

0부터 9까지의 아라비아 숫자와 매치. [0-9]과 같은 의미

\f

form-feed와 매치

\n

linefeed와 매치

\r

캐리지 리턴과 매치

\s

화이트스페이스 문자와 매치. [ \t\n\r\f\v]과 같은 의미

\S

\s가 아닌 문자들과 매치. [^ \t\n\r\f\v]과 같은 의미

\t

탭 의미

\v

수직 탭 의미

\w

w는 문자가 아닌 0, 1, 2, 3 ... 등과 같은 숫자를 의미

\W

W는 문자가 아닌 요소, 즉 % 등과 같은 특수 문자를 의미함

\n

n은 마지막 일치하는 문장

\ooctal
\xhex

8(octal)진수, 10(hex)진수 값

Regular Expression(정규 표현식)과 함께 사용하는 함수들

exec

문장에서 매치를 위해 검색을 수행하는 정규 표현식 메소드
배열을 리턴

test

문장에서 매치를 위해 테스트하는 정규표현식 메소드
True 또는 False 리턴

match

문장에서 매치를 위해 검색을 수행하는 string 메소드
배열 또는 null 문자 리턴

search

문장에서 매치를 위해 테스트하는 string 메소드
목차나 -1 리턴

replace

문장에서 매치를 위해 검색을 실행하고 문장을 대체하는 String 메소드

split

문장에서 매치하는 부분을 배열에 할당하는 String 메소드

이와 같은 정규 표현 식들의 실행 결과는 예제의 테스트를 통해 확인해 보도록 하십시요.

<SCRIPT LANGUAGE="JavaScript1.2">
myRe=/d(b+)d/g;
myArray = myRe.exec("cdbbdbsbz");

document.writeln("The value of lastIndex is " + myRe.lastIndex);
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript1.2">
myArray = /d(b+)d/g.exec("cdbbdbsbz");
document.writeln("The value of lastIndex is " + /d(b+)d/g.lastIndex);
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript1.2">
re = /(\w+)\s(\w+)/;
str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript1.2">
function getInfo(){
re = /(\w+)\s(\d+)/
re.exec();

window.alert(RegExp.$1 + ", your age is " + RegExp.$2);
}
</SCRIPT>
<BODY>
Enter your first name and your age, and then press Enter.
<FORM>
<INPUT TYPE="text" NAME="NameAge" onChange="getInfo(this);">
</FORM>
</BODY>

<SCRIPT LANGUAGE="JavaScript1.2">

// The name string contains multiple spaces and tabs,
// and may have multiple spaces between first and last names.

names = new String ( "Harry Trump ;Fred Barney; Helen Rigby ;\Bill Abel ;Chris Hand ")
document.write ("---------- Original String" + "<BR>" + "<BR>")
document.write (names + "<BR>" + "<BR>")
// Prepare two regular expression patterns and array storage.

// Split the string into array elements.
// pattern: possible white space then semicolon then possible white space

pattern = /\s*;\s*/

// Break the string into pieces separated by the pattern above and and store the pieces in an array called nameList
nameList = names.split (pattern)

// new pattern: one or more characters then spaces then characters.
// Use parentheses to "memorize" portions of the pattern.
// The memorized portions are referred to later.

pattern = /(\w+)\s+(\w+)/

// New array for holding names being processed.

bySurnameList = new Array;

// Display the name array and populate the new array
// with comma-separated names, last first.
// The replace method removes anything matching the pattern
// and replaces it with the memorized string--second memorized portion
// followed by comma space followed by first memorized portion.
// The variables $1 and $2 refer to the portions
// memorized while matching the pattern.

document.write ("---------- After Split by Regular Expression" + "<BR>")
for ( i = 0; i < nameList.length; i++) {
document.write (nameList[i] + "<BR>")
bySurnameList[i] = nameList[i].replace (pattern, "$2, $1")
}

// Display the new array.

document.write ("---------- Names Reversed" + "<BR>")
for ( i = 0; i < bySurnameList.length; i++) {
document.write (bySurnameList[i] + "<BR>")
}

// Sort by last name, then display the sorted array.

bySurnameList.sort()
document.write ("---------- Sorted" + "<BR>")
for ( i = 0; i < bySurnameList.length; i++) {
document.write (bySurnameList[i] + "<BR>")
}
document.write ("---------- End" + "<BR>")
</SCRIPT>

출처: http://members.tripod.lycos.co.kr

 

'dev' 카테고리의 다른 글

jndi  (0) 2008.08.01
ant  (0) 2008.07.25
검색 & 정규식  (0) 2008.07.25
tomcat  (0) 2008.07.25
jdk  (0) 2008.07.25
Posted by 으랏차
,

tar

Linux 2008. 7. 25. 15:32

tar 명령은 파일을 묶는 명령입니다. 원래는 백업을 위해 테이프백업 장치인 DAT  Device 에 백업을
할 때 쓰는 명령이었지만, 요즘은 파일의 압축이나 묶기에 더 많이 쓰이는 것 같습니다.압축명령에는
compress 나 gzip 이 따로 있지만 tar 명령으로 통합해서 쓰면 편리하고 좋습니다. 이해를 돕기 위해 압축이나 묶여지는 파일을 "대상파일" 이라고 하고,  압축해서 생긴 파일을 "생성파일" 이라고
하겠습니다. 우선 파일을 묶는 방법에 대해 알아 봅시다.

묶기    $ tar cvf  생성 파일명.tar  대상 파일명 또는 대상 디렉토리

풀기    $ tar xvf  생성 파일명.tar


tar 명령으로 파일을 묶을 때는 주의해야 할 것이 있는데 바로 디렉토리 단위로 묶는 것입니다.
공개 자료실등에서 tar 파일을 받아서 풀 경우 디렉토리 단위로 묶지 않은 파일이면 수십개의
파일이 풀려 나와 디렉토리가 엉망이 됩니다.  신경을 써야 됩니다.
tar는 아카이브 안의 파일에 대한 소유권과 허가권을 그대로 가지고 있으며, 심볼릭 링크나 하드링크,
디렉토리 구조를 유지합니다. 뒤에 나오지만 tar를 이용해서 시스템내에서의 데이터의 이동이나
복사에 자주 사용됩니다.


$ tar cvf  doc.tar doc/


위 명령은 디렉토리 doc를 모두 묶어서 doc.tar 파일로 만드는 명령입니다. 풀기는

$ tar xvf doc.tar


doc.tar 파일이 풀리면서 /doc 가 생깁니다. tar 파일의 종류는 다음과 같습니다.

*.tar      

   *.tar.Z     <-- compress 로 압축했을 때

   *.tar.z     <-- gzip 으로 압축(gunzip으로 푼다)  

   *.tar.gz              "

   *.tgz                  "


압축은 compress 나 gzip 등의 명령을 쓰면 됩니다.

 $ compress   대상파일명.tar

 -> 대상파일명.tar.Z

 $ gzip           대상파일명.tar

 -> 대상파일명.tar.gz


풀기는

 $ uncompress  대상파일명.tar.Z

-> 대상파일명.tar

 $ gunzip          대상파일명.tar.gz

-> 대상파일명.tar


각각의 경우에서 뒤의 확장자 .Z .gz가 붙고 떨어지는 것을 주의 깊게 보셔야 합니다.
파일을 풀기 전에 tar 파일의 내용을 알고 싶을 때 직접 풀지 않고 내용을 보려면 -t 옵션을 주면
풀기를 test 할 수 있습니다.

$ tar tvf  대상 파일명.tar


위에서 말 했듯이 tar 명령으로 묶기와 압축을 동시에 수행할 수 있습니다.
바로 tar 명령에서 z 옵션을 주면 되지요.

$ tar cvfz

  $ tar xvfz

  $ tar tvfz


그럼  응용을 해볼까요.  다음의 네 가지는 파일을 묶고 압축하는 방법과 풀기입니다.

1. 전통적인 사용방법

 $ tar cvf  생성파일명.tar  대상파일/

-> 생성파일명.tar

 $ gzip     생성파일명.tar

-> 생성파일명.tar.gz

 $ gunzip  생성파일명.tar.gz

-> 생성파일명.tar

 $ tar xvf   생성파일명.tar

-> 대상파일/


2.파이프를 이용한 압축

$ tar cvf - 대상파일/ | gzip > 생성파일명.tgz

->  생성파일명.tgz

$ gunzip -c  생성파일명.tgz | tar xvf -

->  대상파일/


3. 동시수행

 $ tar cvfz  생성파일명.tgz  대상파일/

-> 생성 파일명.tgz

 $ tar xvfz  생성파일명.tgz

-> 대상파일/


4. 묶어서 디렉토리 옮긴 후 풀기

tar cvf - 대상파일명 | ( cd 디렉토리명 ; tar xvf - )

4번은 파일이나 디렉토리를 묶어서 파이프로 넘기고 cd로 목적 디렉토리로 가서 파일을 푸는 과정으로 하위 디렉토리가 복잡한 디렉토리의 이동에 유용하게 사용됩니다.

출처 : Tong - nae tong님의 서버운영체제통

'Linux' 카테고리의 다른 글

[리눅스] 아파치, mysql, php 소스 설치 절차  (0) 2009.03.17
리눅스에서 Apache2.2.4 + PHP 5.2.3 + mysql 5.1.19 설치  (0) 2009.03.17
명령어2  (0) 2008.07.25
명령어1  (0) 2008.07.25
gcc 사용  (0) 2008.07.25
Posted by 으랏차
,

명령어2

Linux 2008. 7. 25. 15:32

1. 개요

이 문서는 임베디드 리눅스를 개발 할때 가장 많이 사용되는 리눅스 명령어의 목록이다.

2. 표기

이 문서에서는 자세한 설명은 달지 않는다. 단지 사용 빈도에 따라 를 표기한다. 가 많을수록 사용빈도가 많은 명령이라는 의미이다.

3. 파일 관련 명령

명령
설명
중요도
bzip 압축을 하거나 푼다.  
cat 텍스트 화일의 내용을 출력한다. ★★★
cd 디렉토리를 이동한다 ★★★
chgrp 화일의 소유 구룹을 바꾼다
chmod 화일 허가권을 바꾼다. ★★★
chown 화일 소유권을 바꾼다
chroot 루트 디렉토리를 변경하여 명령을 수행한다.  
cp 화일을 복사한다 ★★★
file 화일의 종류를 출력한다
find 화일을 찾는다.  
grep 문자열 검색을 한다. ★★
gzip 압축을 하거나 푼다. ★★
ln 단축 디렉토리나 화일 목록을 만든다.
locate 화일의 위치를 출력한다.
ls 디렉토리 및 화일 목록을 보여준다 ★★★
mkdir 디렉토리를 만든다. ★★★
more 출력을 나누어 표출한다. ★★
mv 화일의 위치를 변경하거나 이름을 바꾼다. ★★★
pwd 현재 디렉토리를 출력한다 ★★
rm 화일을 삭제한다. ★★★
rmdir 디렉토리를 삭제한다.
rpm rpm 패케지를 관리한다. ★★
tail 화일의 뒷부분의 내용을 출력한다  
tar 화일 여러개를 하나의 화일로 만들거나 푼다 ★★★
touch 화일의 최종 수정일을 변경한다  

4. 시스템 관리 명령

이 명령은 시스템을 관리하기 위해서 주로 사용하는 명령이다.

명령
설명
중요도
adduser 사용자 계정을 추가 한다
date 시스템의 시간과 날짜를 보여준거나 수정한다  
dd 화일의 특정 부분을 복사한다  
df 현재 마운트 된 장치 목록을 보여준다
diff 두개의 화일을 비교하여 패치화일을 만든다  
echo 화면에 출력한다 ★★
exit 로그 상태에서 빠져 나간다
insmod 모듈을 커널에 삽입한다. ★★★
kill 수행되고 있는 프로세스를 죽인다 ★★★
ldd 실행화일이 참조하는 동적라이브러리 목록을 보여준다
lsmod 현재 커널에 삽입된 모듈 목록을 보여준다
man 도움말을 보여준다 ★★★
mount 저장장치를 디렉토리와 연결한다 ★★★
patch 패치화일을 적용시킨다
passwd 사용자 암호를 변경한다.
ps 현재 동작되고 있는 프로세스 목록을 보여준다 ★★★
reboot 시스템을 재 부팅 시킨다.  
rmmod 커널에 삽입되어 있는 모듈을 삭제한다. ★★★
shutdown 시스템을 정지 시킨다.
su 루트 권한(슈퍼유저) 모드로 변경한다. ★★★
unmount 마운트 된 디렉토리를 해제한다. ★★★

5. 네크워크 관련 명령

명령
설명
중요도
ftp ftp 클라이언트 유틸리티  
ifconfig 네트워크 인터페이스 설정 ★★★
netstat 네트워크 상태 출력
ping 상대 호스트 네트워크 조사 ★★★
route 네트워크 라우팅 설정
telnet 원격 접속 ★★★

6. 기타

명령
설명
중요도
ae 간단한 문자 화일 편집기
minicom 시리얼 통신 에뮬레이터 ★★★
pico 간단한 문자 화일 편집기  
vi 리눅스 문자 화일 편집기 ★★★
     
gcc pc용 컴파일러 ★★★
arm-linx-gcc arm 용 크로스 컴파일러 ★★★
make   ★★★

'Linux' 카테고리의 다른 글

리눅스에서 Apache2.2.4 + PHP 5.2.3 + mysql 5.1.19 설치  (0) 2009.03.17
tar  (0) 2008.07.25
명령어1  (0) 2008.07.25
gcc 사용  (0) 2008.07.25
gcc install  (0) 2008.07.25
Posted by 으랏차
,

명령어1

Linux 2008. 7. 25. 15:31
pwd
현제의 디렉토리를 알려준다.현재 작업하고 있는 디렉토리가 어디인지 알수 없을 때
이용하는 명령어.

기본적인 명령어 사용
list,ls:디렉토리와 파일의 리스트를 보여준다.
ls -l:자세히 보여주기
ls -a:사그리 다보여주기
ls -al:a옵션은 hidden속성의 파일을 표시해주고 1옵션은 파일의 종류,
사용권한등 자세한 정보를 보여준다.
ls -F:일반파일 디렉토리 보여주기
cd명령어
cd~:그전 사용자로 이동
cd -:바로전의 디렉토리로 이동
cd~(사용자명)
cd ../..:상위디렉토리로 이동
cd ../local:상위로 가서 local로 이동한다.
cd:홈디렉토리로 이동
cd~apple/test :apple사용자홈에서 test로 이동
mkdir
새로운 디렉토리를 만든다.
ex)mkdir html
touch
파일 만드는 명령어
cat
파일만들고 파일내용편집 특정함수를 넣을수 있음
rm
파일을 삭제한다.
rm -rf
파일 디렉토리 지울때 사용
mv
명령어 예) mv abc def : abc파일을def로 바꿈
디렉토리 바꾸는 명령어
예)mv testdir ../test:이름을test로 바꿔서testdir을 몽땅옴김

< :표준입력
1>:표준출력
>:표준에러

디렉토리 권한
ls -l test.txt
-rw-r--r-- sw9721107 1997
-rw-:read,user
r--:writing,groub
r--:실행.other

허가를바꾸는 명령어
chmode(파일명,디렉토리명)

editer
vi기능
/:찾기
/n:다음찾기

커서이동
왼쪽:h
위:k
오른쪽:o
아래:j

d: 지우는 명령어
dw:한단어씩지움
3dw:3단어씩지움
d$:뒤쪽으로지움(오른쪽)
d^:앞쪽으로 지움(왼쪽)
dgg:현제커서 위치에서 지움
dd:한줄지우기
3dd:3줄지우기
y:복사
yy:한줄복사
yw:한위드 복사
p:붙이다
c:바꾸다
x(소문자):커서 문자만 지움
X(대문자):빽스페이스
u:복구명령어
esc:command mode
I: insert moad
b : 단어의 시작위치로 이동
e : 단어의 끝 부분으로 이동
0 : 행의 시작부분으로 이동
q : 끝내기
q! : 저장 않고 끝내기

4월26일
표준출력:>
표준입력:<
표준에러:2>
ls 2>aa :에러가 나면 aa로 보내겠다.
ls bb :에러가 나지 않으면aa 에러가나면 bb로 보내겠다.
ls >aa 2&1 :에러도 aa에 다넣겠다.
ls 2>aa 1>&2 :표준출력,표준에러와 같이쓰겠다.
ls >aa 2>del/null :에러 발생시 휴지통에 버리겠다.
ls >/dev/null/2&1 :출력에러를 휴지통에 버리겠다.

#pipeline-->|(기호)
ls -al |
#grep :대표적인 필터 명령어.
행단위로 검색
표준입력 date를 받을수있음.
키보드에서 date를 받을수있음.
ls -al | grep :모든 파일을 행으로 찾겠다.
ls -al | grep ^d :맨 앞이 d로 시작하는 디렉토리를 보여줌.
who | grep sw9721107 :who 에들어돈 file을 찾는다.(출력)

#wc :덩어리 단위로 글자수 출력
예)i love unix
1 3 12
줄 덩어리 글자수
#mesg n:메세지 오는걸 막음.

#awk :특정한 필터를 뽑음.
예)$awk 'unix/{print$0}' test.txt
unix
i love unix
:test.txt file 에서 unix가 들어건 패턴을 출력.
$awk -F: '{print$2{' sort.txt
-F:필터의 구분을 :로 하여라라는 뜻
print {$1 $7} :1번째 7번째를 출력.

# shell programmming
(bash)
입력:read
$read test
hello
출력:echo
-n:맨 앞으로
$echo $test
출력>hello
hell를 test에 입력해서 echo 기능으로 test의 hello를 불러에서 출력한다. 변수를 읽는다

# ln명령어
symbolic -s
hard -inrode번호로 공유
-n:맨앞으로



5월2일
mkdir testdir
ln -s testdir sdir
sdir:가상디렉토리

$ps=process=자기프로세서를 보여줌
예)$ps
PID TIME CHD
7860 pts/20 00:00:00 bash
10893 pts/20 00:00:00 ps
$ps aux:현재수행하고 있는 모든 프로세서를 다보여줌
touch a:a라는 파일을 만듬
vi a :a라는 파일에서 vi작업함
#!/bin/sh
while true : do
echo hello
sleep 1
done
./a :작업한걸 실행 실행하면 hello가 쭉나옴...
ctrl+z:잠시중지
jobs :작업내용을 보여줌
forground:키보드상에 신호를 보낼수있음
background(=&):키보드상에 신호를 보낼수없음
la & :독단적으로 수행,다른 작업실행 못함
kill %1:jobs로 나온 작업내용중1번을 지움
find / *.html > temp 2> /dev /null &
:html로 끝나는 확장자를 모두 찾아서temp라는 곳을로 보내고
에러시에는 휴지통으로 보내라는 뜻

# kill 내용
kill -l:kill의 모든 내용을 보여줌 1~63번까지 있음
kill의 중요한 것들
1)sighup(-hup) :죽였다가 살리는 기능,환경화면을 바꾸는 기능
2)sigint(-int) :ctrl+c,키보드상에 입력가능
3)sigquit(-quit) :ctul+/,키보드상에 입력가능
9)sigkill(-kill) :작업내용을 못지우는것들을 강제로지움
15)sigterm(-term):정상종료

예)kill -1 pid(프로세서 아이디):프로세서를 죽였다살림

5월10일
#! bin/sh
trap 'echo 메롱'2
while true : do
echo hello
sleep
done
실행)./hello.sh
hello
.
.
hello
cltl+c--> 메롱
cltl+z--> 멈춤

expr: 산술식이라는 것을 알려줌
a=1
a=' expr $a + 1'
echo $a

1에서10까지 더한값이 나오는 것
#! /bin/sh
sum=0
a=1
while [$a le 10 ];do
sum='expr $sum + $a'
a='expr $ + 1'
done
echo $ sum

< :입력리다이렉션
> :출력리다이렉션
>>:파일출력추가
cat >test.txt
love
echo like >>test
cat test.txt이걸로 확인하면....
love
like
love뒤에 like가 나옴
<< :here document
cat << e >a.txt
>i love unix
>i love unix
>e
e를 치는 순간 a.txt에 i love unix가 들어감

mail sw9721107 << e
>i love unix
>do you love me?
>e
:9721107이라는 친구에게 i love unix
do you love me?
라고 멜을보냄.
멜 삭제: d1: 1번멜 삭제
d2: 2번멜 삭제
d*: 모든멜 삭제
man.test: test명령어 도움말
help test

if test if abc.txt ; then touch abc.txt :abc라는 파일이 있음true라고 출력
> echo true 없음 false라고 출력함
>else
>echo false
>fi

for i * ; do
>echo $i
>done
:모든걸 가져와서 출력하라
현제 디렉토ㅓ리 파일만 출력

#!/bin/sh
for i in *.hrml
echo $i
done
./hello
insdex.html
:html로 끝나는 모든 파일을 나타냄
5월17,24일
@if 문이용두개의 문자열을 받아 같으면 SAME 아니면 NOT SAME로 나타내는 문
#!/bin/sh
read str1
read str2
if test $str | = $str2; then
echo same
else
echo not same
fi
출력)
./a ./a
a a
a b
same not same

foo=test.c
bar=`vasename $foo.c`
echo $bar

test.c
bash-2.04

aa=hello
echo $aa
:hello
echo ${aa}world
:helloworld

@for문을 이용해 1~10까지의 합을 구하는 문
sum
for i in 1 2 3 4 5 6 7 8 9 10; do
sum=`expr $sum+$i echo $i
done
echo $sum
@*.c를 .cpp로 확장명을 바꾸는 문
#!/bin/sh
for i in *.c; do
foo=`basename $i.c`
mv $i ${foo}.cpp
done

foo=test.cpp
echo ${foo%.cpp} :test %앞의것을 자름
echo ${foo#test} :cpp #뒤의것을 자름

용어
tar :여러개의 파일을 하나 또는 반대 디렉토리 안에서 모음
tar cvf test.tar :test라는 디렉토리에 파일을 하나로 모음
tar xcf test.tar :파일을 풀어버림
gzip test.tar :압축하는 기능
gunzip test.tar.gz:압축을 품
tar xvfz teest.tar.gz:압축도 풀고 tar이른 파일도 품
gzip dc test.tar.gzltar xvf _:안에 있는 파일까지 압축 한방에 압축

5월31일
접속한 사람 확인하는 문
#!/bin/sh
until who | grep mntlee >/dev/null ; do
sleep 2
done
아규먼트가 한줄에 한개씩 출력하는 문
#!/bin/sh
set date`
while[s# -ne 0 ] ; do
echo $1
shift
done
실행)Fri
Jun
1
18:55:21
EDT
2001

gerp -l:파일명
-w:단어단위
-v:포함되지 않는것


who|grep mntlee
if who|grep mntlle>/dev/null ; then
echo yes
else
echo no
fi
실행)yes
if who|grep mntlee ; then
echo yes
else
echo no
fi
실행)mntlee `pts/15 may 3/09:53
yes



#export 명령어#
1.export foo=love
2.foo=love
export foo

foo=love(enter)
[8] exit126 ./a mntlee
echo $foo(enter)
love
bash(enter)자식쉘생성
echo $foo(enter)
exit(enter)자신의 쉘로 돌아옴
exit

mv.bash-profile .bash-pro
vi .vash-profile
#!/bin/sh
echo hello

echo $PS(enter)=for ; do
[
echo $PS2(enter)
>

연습문제
track.sed
/^[0-9].*/d
/^---/d
s/^/logout/


track.cleanup
:뒤에 오는 파일를 비우는 스크립트
echo stop tracking
:멈추는거....
rm -f .track.old.$1 .t문자를 변수 선언
;;
-n*)
loopCount=`expr substr $arg 3 10` :loopCount라는 변수에 저장
;;
*)
user=$arg :user에 arg를 대입
;;
esac :case문 종료
done
if [ ! "$user" ] :user가 없으면
then
error=1 :error의 값은 1로 출력
fi :if문 종료
if [ $error -eq 1 ] :if문 시작 error -ep 1
then
cat << ENDOFERROR :ENDOFERROR로 출력
usage : track [-n#] [-t#] userId :메세지 출력
ENDOFERROR
exit 1 :비정상종료
fi :if문 종료
trap 'track.cleanup $$; exit $exitCode' 0 :
trap ' exitCode=1 ; exit' 2 3 :
> .track.old.$$ :old파일생성
count=0
while [ $count -lt $loopCount ] :count가 $loopCount보다 작은동안에
do
who | grep $user | sort > .track.new.$$ :who를 user에서 추축해서 sort가있음 track.new생성
diff .track.new.$$ .track.old.$$ | :new파일과 old파일을 비교
sed -f track.sed > .track.report.$$ :sed -f track.sed가있음 report파일생성
if [ -s .track.report.$$ ] :track.report라는 파일에 한개의 문자라도 있으면
then
echo track report for ${user}: :user라는 폴더에track,report가 있음
cat .track.report.$$ :track,report출력
fi :if문종료
mv .track.new.$$ .track.old.$$ :mv는 파일 바꾸기track.new--->track.old로 바꿈
sleep $pause :sleep는 멈춤
count=`expr $count + 1` :값이 1씩 증가한다.
done :do문 종료
exitCode=0 :모든프로그램종료 빠져나옴

6/7일
#!/bin/sh
foo=like
./test.sh--->자식쉘생성,자식쉘은 실행하면 끝남
echo $foo
. test.sh--->현재쉘
echo $foo

KEY멥핑
#include
main(){
printf("i can");
printf("do it");
}

커서가...printf("i can.......) f밑에 있을때 멘앞을로 보내서/넣는 방법
:I를 친다음/*치고 esc치고 A*/치고 esc를 치면 끝

map ctrl+v:저장할기능들을 입력
map (ctrl+v F3) I/* (ctrl+v) A*/(ctrl+v esc)
$home/.v

cut 필터명령어
cut:필드의 일부분을 잘라냄
cut -f love unix(enter)
i love unix

apple(tab)pear(tab)grape(tab)bery(tab)bapa(tab)orange-----> cat.txt
cat -f2 cut.txt
실행)apple pear grape
bery bapa orange
cut -c7-10 cut.txt
실행)pear
bapa
cut -c-7 cut.txt
실행)apple p
bery b

vi 작업
%/s/ctrl+v tab/ /g
tab를 스페이스바로 바꾸기
ls -lt > bb$$ $$:임시 파일만들때 사용

보안
which passwd
--->/usr/bin/passwd
ls -l /usr/bin/passwd
--->-r-s--x--x 1 root root 13536 jul 12 2000 /usr/bin/passwd
chmod 6711 fo
ls -l fo
--->-rws--s--x 1 sw9721107 1997
chmod 1777 tdir
ls -ld tdir
--->drwxrwxrwt 2 sw9721107 1997

setuid 2
:권하은 -r-s--x--x setid가 s를 뜻함
setgid 4
:파일을 실행하는 동안은 그룹의 권한을 가지게 되는것
sticky bit 1
:이권한을 주면 주인아니면 지울수 없음

출처 : Tong - nae tong님의 서버운영체제통

'Linux' 카테고리의 다른 글

tar  (0) 2008.07.25
명령어2  (0) 2008.07.25
gcc 사용  (0) 2008.07.25
gcc install  (0) 2008.07.25
chown  (0) 2008.07.25
Posted by 으랏차
,

검색 & 정규식

dev 2008. 7. 25. 15:30

이번 회에서는 vim 내에서 특정 표현을 검색하고 치환하는 방법을 배워보도록 하겠다. 좀더 복잡한 패턴의 검색을

위해서는 정규표현식이라는 것을 사용해야만 한다. 비단 vim 뿐만 아니라 많은 유틸리티에서도 사용하는 정규표현

식을 어느 정도 익히게 되면 어렵게만 느껴졌던 많은 명령어들이 그만큼 친숙하게 다가올 것이다.


1. 검색

이번 장에서는 vim을 통해 검색하기 위해 다음과 같은 기본적인 내용에 다루기로 한다.

- 순방향, 역방향 검색
- 검색 옵션

1.1 순방향, 역방향 검색

일반적인 검색이란 문서의 시작 혹은 현재 위치에서 문서의 끝방향으로 검색을 해나가게 되는데 이를 순방향 검색

이라 한다. 반대로 현재의 위치에서 문서의 처음 방향으로 검색을 해나갈 수도 있는데 이를 역방향 검색이라 한다. 이 두 가지 방식의 검색은 단지 종이 한 장 차이만 날뿐 복잡한 차이는 없다.
vim는 '/' 명령으로 순방향 검색을 실시한다. "Normal Mode"에서 '/'를 쳐주게 되면 다음 그림처럼 커서가 좌측하

단으로 이동하면서 밑줄에 '/' 가 적히게 된다. 이 상태에서 검색하고 싶은 문자열을 적어주면 된다. 반대로 역방향

검색은 '/' 대신 '-' 로 검색 명령을 내리면 된다.


변경전 확인


/ 나 - 로 검색 명령을 내린 뒤 를 치게되면 커서가 처음 발견한 위치에 놓이게 된다. 같은 검색을 계속하기 위해서

는 "Normal Mode" 상태 그대로에서 'n'을 누르면 된다. 이 때 검색 방향으로 다음 발견한 위치에 커서가 놓이게 된

다.

다음 예에서 ‘/it’ 으로 검색 한 후 'n'을 누르게 되면 14, 16, 17, 22 번째 줄 순서대로 커서가 이동해가게 된다.

13 A love like ours is love that's hard to find
14 How could we let it slip away-
15
16 We've come too far to leave it all behind
17 How could we end it all this way-
18 When tomorrow comes and we both regret
19 The things we said today
20
21 A love like ours is love that's hard to find
22 How could we let it slip away-

위의 예에서도 보듯 'n'은 검색 방향으로 검색 결과를 추적해 간다. 만약 검색방향의 반대 방향으로 추적을 하고 싶

으면 'N'을 누르면 된다.
한가지 주의 할 것은 vim을 통해 검색할 때 ‘^$*[]’ 등과 같은 특수 문자는 뒤에서 배울 정규표현식을 위해 특별한

용도로 사용된다. 그렇기 때문에 '$' 문자 자체를 검사하고 싶다면
$ 앞에 \를 추가하여 \$ 와 같이 검색해야 한다.

1
2 $ dollar
3 Good Morning!
4

위의 예에서 '$' 라는 문자를 검색하기 위해 /$ 로 명령을 내리면 아마 검색 결과가 줄의 끝을 가르킬 것이다. 이에

대한 자세한 이유는 뒤에 설명하기로 하고 제대로 한다면 /\$ 로 검색하기 바란다.
여러 가지 검색어로 검색을 한 경우 vim 는 history 기능으로 전에 검색했던 검색어를 쉽게 재활용 할 수 있다.
지금까지 다음과 같이 세 검색어로 검색을 한 경우

/aaa
/bbb
/cccc

/를 누른 상태에서 화살표 Up, Down 키를 누르면 전에 검색했던 검색어로 찾아 들어가게 된다. 원하는 검색어를

찾을 경우 만 쳐주면 다시 검색을 실시 할 수 있다.

1.2 검색 옵션

이번 절에서는 검색 결과나 방법에 영향을 줄 수 있는 몇 가지 옵션에 대해 알아보도록 하겠다. 특별한 옵션이 없다

면 vim 은 검색할 때 대소문자를 구별한다. 그래서 /abc 와 /ABC 는 전혀 다른 검색 결과를 보여주게 된다. 대소문

자를 구분하지 않고 검색하고 싶다면 "Command Mode"에서 다음과 같은 명령을 내려주면 된다.

:set ignorecase 혹은 :set ic

다시 대소문자를 구분하고 싶으면

:set noignorecase

명령을 내려주면 된다.

일단 vim에서 검색을 하게 되면 검색어에 해당되는 결과는 바탕이 강조되어 보이게 된다. 이 결과는 다른 검색을 할

 때까지 그대로 표시가 되는데 가끔 편집할 때 눈이 피로해 보이는 경우가 있다. 만약 강조(highlight)되는 것을 없

애고 싶다면 다음과 같은 명령을 내려주면 된다.

:set nohlsearch

다시 강조하게 하고 싶으면

:set hlsearch

명령을 내려주면 된다.

vim 이 디폴트로 세팅되어 있다면 검색어를 완벽히 입력하고 를 쳐야만 비로소 검색을 시작하게 된다. 이와 반대로

‘find' 라는 단어를 찾을 때 f, i, n, d 한글자 한글자 입력할 때마다 그때 그때의 결과를 바로 볼 수 있는 검색을 incr

emental searching 이라고 한다. 이러한 검색을 사용하면 정확히 찾고자 하는 단어가 떠오르지 않을 때 조금씩 단

어를 완성해가면서 검색을 할 수 있다. 검색 방법을 incremental searching 으로 바꾸려면

:set incsearch

이란 명령을 입력하면 된다. 반대로 해제는 다른 옵션과 마찬가지로 앞에 no를 앞에 붙여

:set noincsearch

명령을 내려주면 된다.


2. 정규 표현식(regular expression)

정규표현식이란 주로 문자열 내에서 검색이나 조작에 사용되는 표현식으로써 특정한 패턴을 가지고 그 패턴에 부

합되는 문자열을 찾아내 원하는 일을 수행 할 수가 있다. 정규표현식은 비단 vim 뿐만 아니라 sed, grep, 과 같은

유틸리티부터 시작해서 vim, emacs 와 같은 편집기 그리고 perl, php 와 같은 프로그래밍 언어에까지 문자열을 다

루는 프로그램에는 거의 모두 사용되고 있다. 하지만 정규표현식이 쓰이는 모든 프로그램에서 동일한 문법으로 정

규표현식을 규정하고 있지는 않는다. 그렇기 때문에 vim에서 사용하는 정규표현식을 완벽히 익혔다 하더라도 다른

 프로그램에서 정규표현식을 사용할 때는 표현이 적절한 지 미리 알아 보아야 한다. 하지만 그렇다고 너무 걱정할

필요는 없다. 문법이 다르다고는 하지만 기본적인 내용은 모두 같고 약간의 형식만 다르기 때문이다. 이번 절에서

는 정규표현식의 기본적인 문법을 검색으로 실습하며 익혀 보기로 하겠다.

2.1 문자 패턴

[abc] : a, b, c 문자 중 한 문자를 가리킨다.
만약 b[abc]ll 라고 검색을 하면 ball, bbll, bcll 이 세 개의 문자열 중 하나가 검색 될 것이다. [] 안에는 알파벳이나

숫자가 올 수 있고 이 안에 나열되어 있는 문자 중 한 문자를 가리키게 되는 것이다. 즉 [abc] 는 검색에서 한 문자

처럼 취급을 받을 것이다. 만약 [] 안에 특수 문자를 넣고 싶으면 앞에 꼭 \를 넣어줘야 원하는 패턴을 만들 수 있

다.

[a-z], [0-9], [A-Z0-9] : [] 안에는 문자의 범위가 들어 갈 수도 있다.
[a-z] 는 결코 a, -, z 라는 문자 중 한 문자를 가리키지 않는다. 대신 알파벳의 모든 소문자 a, b, c .... x, y, z를

가리킨다. - 가 [] 안에 들어가게 되면 문자의 범위를 나타내는 특수한 역할을 하게 되는 것이다. 비슷하게 [0-9]

는 숫자 [A-Z0-9] 는 알파벳 대문자와 숫자를 나타낸다.

. : 정규표현식에서 . 은 new line 문자(엔터)를 제외한 모든 문자를 가리킨다. 즉 알파벳 혹은 공백과 같은 특수문

자, 숫자 모두 . 에 속하게 된다.

[^a-z] : ^ 가 [] 안에 들어오면 안에 나열되어 있는 문자를 제외한 다른 모든 문자를 나타낸다. 이와 같이 하면 알

파벳 소문자를 제외한 모든 문자, 즉 대문자, 숫자, 특수문자 모두가 이에 해당된다.

특수문자 : 특수문자는 항상 \ 와 같이 쓰여야 문자 그대로의 의미를 나타낸다. 공백(Space)는 '\ ' 로 Space 앞

에 \를 붙여주면 된다.

그럼 지금까지 익힌 문자 패턴을 이용하여 몇가지 예를 들어 보기로 하겠다.
첫문자는 무조건 대문자로 시작하고 곧바로 숫자가 2자리 오는 패턴을 정규표현식으로 만들면 어떻게 될까- 대문

자는 [A-Z], 숫자는 [0-9], 그리고 숫자가 2번 오기 때문에 [A-Z][0-9][0-9] 이렇게 하면 표현식이 완성된다.

2.2 위치

^문자열 : '^' 다음에 문자열이 오면 해당 문자열이 줄의 처음에 오는 경우이다.
밑의 문장에서 /^The 로 검색을 하게 되면 줄의 맨 처음에 위치한 The 만 표현식에 해당된다. [ ] 내에 있던 ^ 과

혼동하지 않기를 바란다.

The things we said today, The things we said today

두 번째 The 는 문장의 처음에 오지 않았기 때문에 표현식과 맞지 않는 표현이다.

문자열$ : 문자열 다음에 $를 붙이게 되면 해당 문자열이 줄의 끝에 오는 경우를 가리킨다.
위의 예에서 /today$ 로 검색하면

The things we said today, The things we said today

뒤에 있는 today 만 검색된다. 가운데 있는 today 는 줄의 끝에 있지 않기 때문이다.

2.3 반복

반복을 지정하는 표현식은 문자 뒤에 적어 앞에 있는 문자가 몇 개까지 반복되는 지를 지정한다.

* : 0 번 이상
\+ : 1 번 이상 (vim only)
\- : 0번 혹은 1번 (vim only)

\+ 와 \- 는 전통적인 vi 에서는 제공되지 않고 vim 에서만 사용할 수 있다. 물론 리눅스에 설치되어 있는 vi는 vim

이기 때문에 사용 가능하다. 그럼 차근차근 예를 들어 설명해 보면,

ab* 는 b라는 문자가 없을 수도 있고 한번 이상 올 수도 있다. 그렇기 때문에 a, ab, abb, abbb, 모두 이 표현식을

 만족한다.
ab\+ 는 ab* 와 달리 반드시 b 라는 문자가 한번 이상 와야 한다. 때문에 a 는 이 표현식을 만족시키지 못한다. a

b, abb, abbb처럼 반드시 a 뒤에 b가 한번 이상은 존재해야만 한다.
ab\- 는 a 뒤에 b가 올 수도 오지 않을 수 도 있다. 즉 a, ab 둘다 이 표현식을 만족한다.

그럼 abc 와 같은 문자열이 반복되는 정규표현식은 어떻게 만들 수 있을까- 바로 문자들을
\( 와 \) 안에 묶어 두면 된다.
\(abc\)* 는 abc 문자열이 0번 이상 반복되는 표현식이고
\(abc\)\+ 는 abc 문자열이 1번 이상 반복되는 표현식이다.

※ 만약 여러분이 /\(abc\)* 와 같은 검색을 명령을 내리면 vi 는 아마도 모든 문자가 검색결과로 지정 될 것이다. 왜냐하면 * 특성 자체가 0번도 인정하기 때문에 굳이 abc 라는 문자열이 없어도 표현식을 만족하기 때문이다.

짧은 단어를 검색하고자 할 때 간혹 그 단어가 포함된 다른 단어까지 같이 검색 되어지곤 할 것이다. 일 예로 'be'

란 단어를 검색하다보면 behind 와 같이 검색어가 포함된 단어도 같이 검색이 된다. 만약 be 앞뒤로 공백 문자가

있는 단어 자체를 검색하고 싶을때, 지금까지 배운 방법을 사용하면 '\ be\ '처럼 할 수 도 있다. 하지만 이나

지 모두 고려하려다 보면 표현식이 약간 지저분해 질 수 있다. 이때 깔끔히 사용할 수 있는 정규표현식이 \<\> 이

다.

/\ 로 검색을 하면 완벽한 단어인 be (앞뒤로 공백문자가 있는) 가 검색 된다.

지금까지 배운 정규표현식을 응용하여 검색을 해보도록 하자.
반드시 줄의 시작은 알파벳 하나 이상으로 시작하고 중간에 하나 이상의 공백 문자 다음에 2개 이상의 숫자가 오는

 패턴은 어떻게 정규표현식으로 나타낼 수 있을까-

먼저 하나 이상의 알파벳으로 줄이 시작하기 때문에
^[A-Za-z]\+
와 같은 표현식을 쓸 수 있다. 대소문자를 따로 언급하지 않았기 때문에 대문자와 소문자 모두 속해 있어야 한다.
중간에 하나 이상의 공백 문자가 오는 것까지 첨가하면
^[A-Za-z]\+\ \+
로 \ \+ 가 추가되었다.
끝으로 2개 이상의 숫자가 오기 때문에
^[A-Za-z]\+\ \+[0-9][0-9]\+ 와 같이 쓸 수 있다.


3. 바꾸기

검색과 함께 빼놓을 수 없는 것은 바꾸기 일 것이다. 대부분 검색을 하게되면 검색으로 끝나지 않고 다른 단어로 바

꾸는 작업이 같이 이루어진다.

3.1 바꾸기 문법

검색한 패턴을 다른 단어로 바꾸기 위해서는 먼저 범위를 지정하고 검색어와 변경할 문자열을 지정하면 된다. 이번

 절에서는 기본적인 바꾸기 작업을 배워 보도록 하겠다.

바꾸기 위한 기본적인 문법은 다음과 같다.

:<시작줄 번호>,<끝 번호> s/검색어/바꿀단어/옵션

위의 문법으로 다음과 같은 예를 들 수 있다.

:1,10 s/The/the/g

해석해 보면 1번째 줄에서 10번째 줄 사이에 있는 "The" 라는 단어를 "the"로 바꾸라는 명령이다. 맨 끝의 g 라는

 옵션은 모든 검색어에 대해 변경을 실시하게 해준다. 만약 g 옵션이 없을 경우 한 줄에 2 개 이상의 The 가 있을 경

우 첫 번째 "The" 만 "the"로 변경을 하게 된다.

이외에 줄 번호를 가리키는 특별한 문자가 있다.

. : 현재 커서가 놓여 있는 줄의 번호
$ : 마지막 줄

:.,$ s/The/the/g

위의 명령은 현재에서 마지막 줄까지 모든 "The"를 "the" 로 바꾸게 한다.

바꾸기 문법중 검색어에는 2장에서 배운 정규표현식을 사용 할 수 있다. 만약 모든 줄에서 다른 단어에 포함되지 않

은 "be" 라는 단어를 검색하여 대문자 "BE"로 변경하고 싶다면

:1,$ s/\/BE/g

처럼 명령을 내릴 수 있다.

만약 정규표현식에 익숙하지 않다면 완벽한 예제를 보며 차근차근 익히기 바란다.

3.2 정규표현식과 변수

2장의 정규표현식에서 \( \) 는 문자열을 하나의 단위로 보게 하는 역할을 하였다. 하지만 바꾸기에 사용 될 경우

 변수 역할도 하게 된다.

abcd 100 이란 문장과 \([a-z]\+\)\ \([0-9]\+\) 이러한 정규표현식이 있다고 하자.

위의 문장과 정규표현식을 분석해 보면 앞의 abcd 는 뒤의 정규표현식 \([a-z]\+\) 에 해당하고 숫자 100 은

\([0-9]\+\) 에 해당하는 것을 알 수 있을 것이다. 그리고 가운데 공백은 정규표현식 '\ ' 에 해당한다.

정규표현식에서는 \( \)에 대해 하나의 단위로 묶으면서 동시에 \1, \2 와 같은 변수에 대응을 시킨다. 즉 위와

같은 경우 첫 번째 \( \) 는 \1에, 두 번째 \( \) 는 \2 라는 변수에 저장되는 것이다.

다음과 같은 문서가 있다고 보자.

height 150
weight 60
age 20

위와 같은 문서에서 문자와 숫자의 위치를 바꿔 다음과 같이 만들고 싶다.

150 height
60 weight
20 age

정규표현식의 변수와 vim의 바꾸기를 사용하여 앞 뒤 순서를 한번 바꾸어 보도록 하겠다.

:1,$ s/\([a-z]\+\)\(\ \+\)\([0-9]\+\)/\3\2\1/g

다소 복잡해 보이지만 차근차근 분석해 보도록 하겠다.

1,$ : 검색의 범위를 처음에서 끝 줄까지로 지정을 하였다.
s/.../.../g : 언제나 검색 및 바꾸기는 이러한 문법을 사용한다.

자 그럼 검색어 부분을 분석해보도록 하자.

\([a-z]\+\)\(\ \+\)\([0-9]\+\)

이 검색어를 \( \) 로 구분해 보면 다음 3개로 나뉘어 진다.
\([a-z]\+\) → \1 알파벳 문자 1개 이상
\(\ \+\) → \2 공백 문자 1개 이상
\([0-9]\+\) → \3 숫자 1개 이상

자 그럼 여기까지 검색어 부분을 분석해 보았다. 그럼 변경할 문자열을 분석해 보자.

\3\2\1

이것은 검색어 \1\2\3 의 순서만 바꾼 것이다.

자 그럼 해당 줄 별로 변수에 들어간 내용을 표로 그려보면

내용
\3
\2
\1
\3\2\1
height 150
weight 60
age 20
hegit
weight
age
" "
" "
" "
150
60
20
150 height
60 weight
20 age



끝으로 바꾸기 명령과 같이 쓰일 수 있는 옵션을 하나 더 알아보도록 하겠다.
지금까지는 바꾸기 명령은 구간내의 모든 검색 결과에 대해 바꾸기를 수행하였다. 물론 모든 검색 결과를 바꾸는

경우라면 문제가 없겠지만, 그 중에 변경하지 않아야 할 내용이 있다면 선택적으로 바꾸기를 행하고 싶을 수도 있

을 것이다. 검색 결과에 대해 일일이 변경 여부를 물어보면 선택적으로 변경할 수 있는 옵션이 있다.



:1,$ s/.../..../gc

바꾸기 명령에 'c' 옵션을 추가하면 변경전 하나한 확인한 후 바꾸기를 실시하게 된다.


2회차에서는 편집에 꼭 필요한 검색 및 바꾸기를 해보았다. 정규표현식의 경우 어렵게 느껴졌을 수도 있겠지만, vi

m 뿐만 아니라 다른 프로그램에서도 활용될 수 있기 때문에 당장 이해가 되지 않더라도 꾸준히 연습할 가치가 있을

것이다.

출처 : Tong - nae tong님의 서버운영체제통

'dev' 카테고리의 다른 글

ant  (0) 2008.07.25
정규식  (0) 2008.07.25
tomcat  (0) 2008.07.25
jdk  (0) 2008.07.25
DOM property, method  (0) 2008.07.24
Posted by 으랏차
,