기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

bash 스크립트 소개

Shell 

shell은 당신이 명령어들을 사용하여 컴퓨터와 상호작용하도록 합니다. 데이터를 주고 받고 또는 저장하는 등의 간단한 작업에서 부터 매우 복잡한 작업등의 일을 할 수 있게 하지요.
터미널에서 date, cal, pwd, ls 등을 실행해 볼까요?
sgoing@sgoing-virtual-machine:~/문서/script$ date
2018. 10. 15. (월) 14:13:20 KST
sgoing@sgoing-virtual-machine:~/문서/script$ cal
      10월 2018       
일 월 화 수 목 금 토 
    1  2  3  4  5  6 
 7  8  9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 31          
                     
sgoing@sgoing-virtual-machine:~/문서/script$ pwd
/home/sgoing/문서/script
sgoing@sgoing-virtual-machine:~/문서/script$ ls
a.log  b.log  bak  c.log  hello.sh

위와같이 터미널에 명령어를 입력하면 shell은 이 명령을 해석하여 kernel로 전달하고 kernel은 컴퓨터의 하드웨어에 명령에 부합하는 정보를 추출 또는 계산하여 다시 shell로 전달하고 이 결과를 모니터에 출력합니다.

Scripting

만일 위의 작업을 매일 한번 이상 자주 실행한다면 매번 위와 같은 작업을 반복하기란 번거롭지요. 만일 위의 명령들을 한번에 실행하도록 프로그램화 하여 저장한다면 편리할 것입니다. 이러한 작업을 스크립팅이라고 합니다.

실행

적당한 편집기로 파일을 작성한 다음 이렇게 만들어진 파일을 다음과 같이 실행파일로 만들어야 합니다.
"chmod +x 파일이름"
파일의 권한에 --x를 첨가하여mode를 변경하는 것 입니다. 권한에 --x가 있으면 실행파일 임을 의미합니다.
"./파일이름"
"./"는 파일을 실행하라는 명령어입니다.
편집기 nanno를 사용하여 test.sh파일을 생성합니다. 이 파일의 내용은 cat를 사용하여 확이할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ nano
sgoing@sgoing-virtual-machine:~/문서/script$ cat test.sh
date
cal
pwd
ls

test.sh 파일이 생성되었지만 그 권한을 보면 실행파일이 아닙니다.(--x 가 없습니다.)
sgoing@sgoing-virtual-machine:~/문서/script$ ls -l
합계 12
...
-rw-r--r-- 1 sgoing sgoing   16 10월 15 14:29 test.sh

그러므로 다음과 같이 하여 실행파일로 전환합니다.
sgoing@sgoing-virtual-machine:~/문서/script$ chmod +x test.sh
sgoing@sgoing-virtual-machine:~/문서/script$ ls -l
합계 12
...
-rwxr-xr-x 1 sgoing sgoing   16 10월 15 14:29 test.sh

이와 같이 변경한 후 실행 할 수 있습니다. 그 결과는 터미널에서 각각의 명령을 실행한 경우와 같습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ ./test.sh
2018. 10. 15. (월) 14:35:00 KST
      10월 2018       
일 월 화 수 목 금 토 
    1  2  3  4  5  6 
 7  8  9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 31          
                     
/home/sgoing/문서/script
a.log  b.log  bak  c.log  hello.sh  test.sh


bash 스크립트를 실행하는 다른 방법은  'bash 파일.sh' 입니다.
sgoing@sgoing-virtual-machine:~/문서/script$ echo data > date.sh
#echo date 는 화면에 date가 출력 이 결과를 date.sh라는 파일로 저장(redirection)
sgoing@sgoing-virtual-machine:~/문서/script$ cat date.sh
#! /bin/bash
date
sgoing@sgoing-virtual-machine:~/문서/script$ bash date.sh
2018. 10. 15. (월) 15:25:41 KST
sgoing@sgoing-virtual-machine:~/문서/script$ ./date.sh
bash: ./date.sh: 허가 거부
sgoing@sgoing-virtual-machine:~/문서/script$ chmod +x date.sh
sgoing@sgoing-virtual-machine:~/문서/script$ ./date.sh
2018. 10. 15. (월) 15:27:24 KST


bash?

bash는 shell을 통해 명령어를 kernel에 전달하는 과정에서 kernel이 이해할 수 있는 방식으로 해석하기 위한 해석기가 필요한데 그러한 해석기 중의 하나입니다. GNU/linux 체계에서 기본으로 장착되어 있는 해석기 입니다.
sgoing@sgoing-virtual-machine:~/문서/script$ echo $SHELL:
/bin/bash:

bash의 위치는 다음과 같이 확인할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ which bash
/bin/bash
각 해석기의 경우 명령어를 해석하는 방식에서 차이를 가집니다. 그러므로 스크립트를 작성할 경우 많은 어떠한 스크립트 언어(shell 해석기)를 사용하는지 지정해야 합니다. 즉, 다음과 같이 스크립트 상단에 기호"#!"와 같이 해석기의 경로를 작성해주어야 합니다.
"#! /bin/bash"

명령어 file은 파일의 종류를 결정합니다.
sgoing@sgoing-virtual-machine:~/문서/script$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
...
sgoing@sgoing-virtual-machine:~/문서/script$ file test.sh
test.sh: ASCII text


주석(comments)

기호 '#'로 시작하면 주석입니다.

변수(Variables)

변수는 데이터를 저장하고 스크립트를 통해 수정된 결과를 나타내는 등 프로그래밍에서 중요한 요소입니다. 
sgoing@sgoing-virtual-machine:~/문서/script$ cat variables.sh
#!/bin/bash

greeting="Welcome" #문자열을 변수로 하는 객체 greeting생성
user=$(whoami) # whoami는 shell을 운영하는 컴 이름을 호출하는 명령어입니다.

#내장 함수 등의 프로그램 또한 변수를 호출할 경우 '$'와 함께 작성합니다.
day=$(date +%A)
#date 역시 날짜를 호출하는 명령어로서 +%A는 요일 만을 출력하라는 인자입니다.
#스크립트에서는 이름과 등호사이에 빈칸을 주지 않습니다.
echo "$greeting back $user! Today is $day, which is the best day of the entire week!"
echo "Your Bash shell version is: $BASH_VERSION. Enjoy!"

sgoing@sgoing-virtual-machine:~/문서/script$ ./variables.sh #./파일명 사이에 빈칸 없음
Welcome back sgoing! Today is 월요일, which is the best day of the entire week!
Your Bash shell version is: 4.4.19(1)-release. Enjoy!
sgoing@sgoing-virtual-machine:~/문서/script$ 


sgoing@sgoing-virtual-machine:~/문서/script$ date --help
사용법: date [옵션]... [+포맷]
  또는:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
...  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   로케일의 전체 요일 이름 (예., 일요일)
  %b   로케일의 줄인 월 이름 (예., Jan)
  %B   로케일의 전체 월 이름 (예., January)
  %c   로케일의 날짜와 시간 (예., 2005년 3월 3일 목요일 23시 05분 25초)
...

주의 : 변수이름에 대문자 사용은 에러를 일으킬 수 있습니다. 대문자 변수명은 internal shell variables로 예약되어 있습니다. 
이러한 프로그밍은 터미널에서 직접적으로 실행할 수 있습니다.
sgoing@sgoing-virtual-machine:~/문서/script$ a=1
sgoing@sgoing-virtual-machine:~/문서/script$ b=21
sgoing@sgoing-virtual-machine:~/문서/script$ echo $a
1
sgoing@sgoing-virtual-machine:~/문서/script$ echo $b
21
sgoing@sgoing-virtual-machine:~/문서/script$ echo $[$a + $b]
22

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b