[Linux]2023.08.21

망구씨·2023년 8월 21일
0

Linux

목록 보기
4/4
post-thumbnail

문제 99. 문제 97번 코드를 수정해서 아래와 같이 수행될 수 있게 하기

$sh find_sal.sh scott

scott의 월급은 3000입니다.

awk -F ',' -v name=$1 '$2==toupper(name) {print $6}' emp.csv
sal=`awk -F ',' -v name=$1 '$2==toupper(name) {print $6}' emp.csv`
echo "$1 의 월급은 $sal 입니다."

명령어로 수행되는 결과를 sal이라는 변수를 할당하기 위해 백틱을 둘러주었다.

✅ 리눅스에서 dba나 db 엔지니어들이 쉘스크립트를 이용해서 스크립트를 작성하는 이유는
1. db작업을 편하게 수행하려고 (노가다 안하고 자동화)
2. 날것의 데이터를 데이터베이스의 테이블로 구성할 때 리눅스 쉘이 유용하게 사용됨

문제 100. 10번 부서번호인 사원들의 모든 행을 emp.csv에서 출력해보기

awk -F ',' '$8==10 {print $0}' emp.csv
✅ $0은 모든 컬럼을 가져와라라는 뜻

문제 101. 위에서 출력되는 행들을 emp10.csv로 저장

[orcl:~]$ awk -F ',' '$8==10 {print $0}' emp.csv >> emp10.csv
[orcl:~]$ cat emp10.csv
7839,KING,PRESIDENT,,1981-11-17,5000,,10
7782,CLARK,MANAGER,7839,1981-05-09,2450,,10
7934,MILLER,CLERK,7782,1982-01-11,1300,,10

✅ 리다이렉션 (>>) 기존 파일 뒤에 내용을 덧붙이는 것이고, (>) 하나는 기존 파일의 내용을 완전히 덮어쓰는 것이다.
: 방금 나는 그냥 기존에 emp10.csv를 rm하고 새로 만들었음.

문제 102. (dba게 유용) emp10.csv를 오라클의 테이블로 구성하시오. 테이블명은 emp10으로 생성합니다.
✔️ 가장 쉬운 방법은 sql developer를 이용하는 것.

집에서 sqldeveloper 실행하는 방법

문제 103. 집에서 sqldeveloper 실행하는 방법을 다음과 같이 해봅니다
1. 모바텀 열기
2. 오라클 유저로 접속

3. x server 활성화 (클릭하지 말고 마우스 올려놓으면 x server is running이라고 뜬다.)

4. 내 아이피 확인( 프롬프트에서 ipconfig)

5. 푸티나 모바텀에서 아래 명령어로 실행

create table emp10
as
 select *
   from emp
    where 1 = 2;


✅ 만든 emp10에 데이터 임포트를 위와같이 한다. 헤더를 체크하고, 다음버튼 누르다가 입사일에 해당하는 열5를 클릭하고 데이터 형식에 RRRR/MM/DD 작성한후 완료한다.


💡 확인 !


문제 104. 부서번호를 물어보게하고 부서번호를 입력하면 해당 부서번호에 해당하는 csv파일이 다음과 같이 생성되게 하시오 !

예제
$ sh generate_deptno.sh
생성하고싶은 데이터의 부서번호를 입력하세요 ! -> 10
emp10.csv 가 생성되면 됨.

$ vi generate_deptno.sh
echo -n "생성하고 싶은 데이터의 부서번호를 입력하세요!"
read deptno
awk -F ',' -v num=$deptno '$8==num {print $0}' emp.csv > emp$deptno.csv


-n은 다음라인으로 넘어가지 않게 한다. 쓰지 않으면 그냥 생성하고싶은 데이터의 부서번호를 입력하세요 ! 이 말만 출력하고 다음라인으로 (엔터친것처럼) 넘어간다.

문제 105. 위 스크립트를 이용해서 다음과같이 직업을 물어보게 하고 직업을 입력하면 해당 직업의 csv파일이 생성되게 하세요!

$ vi generate_job.sh 
echo -n "생성하고 싶은 데이터의 직업을 입력하세요!"
read job
awk -F ',' -v num=$job '$3==num {print $0}' emp.csv > $job.csv

문제 106. 위 스크립트를 수정해서 소문자로 해도 가능하게

$ sh generate_job.sh 
---------------------------------
$ vi generate_job.sh  
echo -n "생성하고 싶은 데이터의 직업을 입력하세요!"
read job
awk -F ',' -v num=$job '$3==toupper(num) {print $0}' emp.csv > $job.csv

리눅스 쉘에서 loop문 사용법

💡 리눅스 쉘 스크립트에서의 loop문 3가지
1. for loop : 범위를 기준으로 반복시키는 loop문
2. while loop : 조건을 기준으로 반복시키는 loop문
3. until loop : 조건을 기준으로 반복시키는 loop문
✅ dba 작업을 편하게 자동화하려면 필수로 알아야하는 쉘스크립트 문법

for loop문

문법

for 변수 in 범위
do 
    실행문
done    

예제1

$ vi for1.sh
----
#/bin/bash

for i in {1..10}
do
 echo $i
done  

----
$ sh for1.sh

문제 107. dept.csv를 복사해서 dept1.csv ~ dept100.csv 로 생성하는 쉘스크립트를 작성하세요
$ sh cp_dept.sh 실행하면 생성되도록 !

#/bin/bash

for i in {1..100}
do
 cp dept.csv dept$i.csv
done

$ ls -l dept*.csv

문제 108. 파일중 하나 열어서 파일열고 숫자 20을 200으로 변경

문제 109. dept.csv, dept46.csv와 서로 내용이 차이가 있는지

$ diff --brief dept.csv dept46.csv
: files dept.csv and dept46.csvdiffer (차이가 있으면 이렇게 나온다. 없으면 안나옴)

문제 110. dept.csv, dept1.csv ~ dept100.csv를 비교해서 어느 파일이 차이가 있는지 확인하기

$vi diff_dept.sh
------------------------------
#/bin/bash

for i in {1..100}
do
 diff --brief dept.csv dept{i}.csv
done 

문제 111. (시스템 관리자와 dba에게 유용한 스크립트) database에 있는 데이터 파일들의 사이즈를 확인하기 !

SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
+DATA/orcl/datafile/users.259.796857625
+DATA/orcl/datafile/undotbs1.258.796857625
+DATA/orcl/datafile/sysaux.257.796857623
+DATA/orcl/datafile/system.256.796857621
+DATA/orcl/datafile/example.265.796857803

✅ 이거 db관리수업때 !!!!!!!!!!!!!!!! 신경쓰지말기

문제 112. (시스템 관리자와 dba에게 유용한 스크립트) 확장자가 .sh 쉘 스크립트 중에서 사이즈가 100바이트 이상인 파일들만 출력하시오 !

$ ls -l *.sh 얘는 출력되도 엄청 많으면 일일이 100 넘는걸 확인할 수 없다.

$ ls -l *.sh | awk '{print $5}' 이렇게하면 사이즈 부분만가져올 수 있다.

$vi size_100.sh
size2=`ls -l *.sh | awk '{print $5}'`

for i in $size2
do 
 echo $i
done 

$vi size_100.sh
size2=`ls -l *.sh | awk '{print $5}'`

for i in $size2
do 
 if [ ${i:0:3} -gt 100 ]; then
  echo $i
 fi 
done 
------
$sh size_100.sh

✅ 대괄호 안 ${i:0:3} 가 아니고 $i 라면 지금 이게 문자형으로 인식이 되어서 100이랑 비교될 수 없다. 이것을 숫자형으로 바꿔주는것이 ${i:0:3} 사이즈가 3자리가 안넘어가므로 3을 써주었다. 아래는 파일명도 나오게 변경

$vi size_100.sh
list=`ls -l *.sh | awk '{print $9}'`

for i in $list
do 
 size2=`ls -l $i | awk '{print $5}'`
 if [ $size2 -gt 100 ]; then
  echo $i
 fi 
done 
------
$sh size_100.sh

문제 113. /home/oracle 밑에 size100이라는 디렉토리 생성하기

문제 114. /home/oracle 밑에 있는 100바이트 이상의 확장자 .sh 파일들을 모두 /home/oracle/size100밑으로 이동시키세요 !

$ sh  mv_size_100.sh

답:
$ vi  mv_size_100.sh

list=`ls -l *.sh | grep -v mv_size_100.sh | awk '{print $9}'`

for i in $list
do
  size2=`ls -l $i | awk '{print $5}'`
  if [ $size2 -gt 100 ]; then
   mv /home/oracle/$i   /home/oracle/size100/
  fi
done

$ sh  mv_size_100.sh

grep -v mv_size_100.sh를 빼고 하면 얘도 같이 다른경로로넘어가준다. 근데 얘는 기존 /home/oracle밑에 있게하고싶으면 위 grep을 사용해서 하면 된다.

while loop문

예제1. 리눅스 쉘의 while loop문으로 숫자 1부터 숫자 10까지 출력하기!

$ vi w1.sh
#!/bin/bash

i=1
while [ $i -le 10 ];
do
 echo $i
 i=$((i+1))
done

조건이 트루인 경우에만 두 밑에 반복문 돌려라. i=$((i+1))는 증가코드 ! 여기가 11이 되면 11>=10 이 거짓이 되니까 반복문이 거짓이 되어 그만돌게 된다.

예제2. 위 결과를 다시 출력하는데 짝수만 출력하기

$ vi w1.sh
#!/bin/bash

i=1
while [ $i -le 10 ];
do
 if [ $((i % 2)) -eq 0 ]; then
  echo $i
 fi
  i=$((i+1))
done


✅ 무언가를 계산할 때 $((계산식)) 이렇게 작성되는것을 볼 수 있다.

문제 115. while loop문으로 구구단 2단 출력하기

$ vi w1.sh
#!/bin/bash

i=1
while [ $i -le 9 ];
do
 result=$((2 * i))
 echo "2 x $i = $result"
 i=$((i+1))
done

until문

💡 파이썬과 PL/SQL에는 없는 반복문 (while문이랑 조건이 다르다)
예제1. until문을 이용해서 숫자 1부터 10까지 출력

$ vi u1.sh
-------------------
i=1
until [ $i -gt 10 ] # 조건이 거짓일 동안에만 반복한다. 트루가 되는 순간 반복을 멈춘다. 
do
 echo $i
 i=$((i+1))
done 

문제 116. 위 언틸문으로 구구단 2단 출력

#!/bin/bash

i=1
until [ $i -gt 9 ];
do
 result=$((2 * i))
 echo "2 x $i = $result"
 i=$((i+1))
done

dba에게 필요한 shell 스크립트 작성하기

1. 기본 case문으로 쉘 스크립트문의 뼈대를 만듭니다.

$ vi dba.sh

#!/bin/bash

echo -e "여기는 운영 db입니다."

echo -e "================================"
echo "                           "
echo " [1] 오라클에 접속하려면 1번을 누르세요! "
echo "                           "
echo -n "원하는 작업을 선택하세요."
read aa
echo "                           "
case $aa in 
        1) sqlplus scott/tiger;;
esac
echo "                           "

2. (특급 엔지니어분의 스크립트1) 테이블 스페이스 공간확인 쉘 스크립트

💡 오라클에 접속해서 용량 확인하고 빠져나오는 코드 !

$ vi t.sh
-----------------------------------------------------
export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리
export ORACLE_SID=orcl             #오라클 인스턴스 이름 (db이름)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈
export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정

sqlplus scott/tiger <<EOF 


select * from ((select   t.tablespace_name,
                        ((t.total_size - f.free_size) / t.total_size) * 100 usedspace
                 from (select tablespace_name, sum(bytes)/1024/1024 total_size
                           from dba_data_files
                           group by tablespace_name) t,
                        (select tablespace_name, sum(bytes)/1024/1024 free_size
                           from dba_free_space
                           group by tablespace_name) f
           where t.tablespace_name = f.tablespace_name(+)));



EOF # 스캇으로 접속해서 셀렉트 문장 실행후에 빠져나오려면 위에 <<EOF, 여기 EOF 라고 한다. 
    # 꼭 이렇게 해주어야 하는건 아니지만 이렇게 많이 쓴다. (AAA해도 됨. 대신 둘다 맞추기)

✅ export 4줄을 써야 sqlplus가 열린다.

3. t.sh를 dba.sh 1번에 구성

$ vi  dba.sh

#!/bin/bash

echo -e "
    
    aaa    a   aa     aaa       aaa     a      aaaa
   a   a   a aa      a   a     a        a     a    a
   a   a   aa            a     a        a     aaaaaa
   a   a   a         aaaaa     a        a     a
   a   a   a         a   a     a        a     a
    aaa    a          aaa       aaa     a      aaaa
 "
echo -e "========================================"
echo "                          "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번을 누르세요 "
echo "                          "
echo -n  "원하는 작업을 선택하세요 "
read   aa
echo "                                        "
case  $aa  in
          1) sh /home/oracle/t.sh ;;
esac
echo "                                 "

sar 명령어로 현재 실시간 디스크 i/o의 상황을 확인하여 text 파일로 생성하는데 sar.sh 쉘스크립트를 생성하시오.

$vi sar.sh
-------------------------------------------
sar 1 100 >> sar_2023-821.txt &

sar.sh를 dba 자동화스크립트 2번에 추가

$ vi  dba.sh

#!/bin/bash

echo -e "
    
    aaa    a   aa     aaa       aaa     a      aaaa
   a   a   a aa      a   a     a        a     a    a
   a   a   aa            a     a        a     aaaaaa
   a   a   a         aaaaa     a        a     a
   a   a   a         a   a     a        a     a
    aaa    a          aaa       aaa     a      aaaa
 "
echo -e "========================================"
echo "                          "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번을 누르세요 
[2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번을 누르세요"
echo "                          "
echo -n  "원하는 작업을 선택하세요 "
read   aa
echo "                                        "
case  $aa  in
          1) sh /home/oracle/t.sh ;;
          2) sh /home/oracle/sar.sh ;;
esac
echo "                                 "

현재 DB에 어떠한 이슈가 있는지 확인하는 shell스크립트 작성

$ vi o.sh
-----------------------
export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리
export ORACLE_SID=orcl             #오라클 인스턴스 이름 (db이름)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈
export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정

sqlplus scott/tiger <<EOF 

select reason from dba_outstanding_alerts;

EOF

위 o.sh를 dba자동화스크립트 (dba.sh) 3번에 넣기

$ vi  dba.sh

#!/bin/bash

echo -e "
    
    aaa    a   aa     aaa       aaa     a      aaaa
   a   a   a aa      a   a     a        a     a    a
   a   a   aa            a     a        a     aaaaaa
   a   a   a         aaaaa     a        a     a
   a   a   a         a   a     a        a     a
    aaa    a          aaa       aaa     a      aaaa
 "
echo -e "========================================"
echo "                          "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번
 [2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번
 [3] 현재 데이터베이스에 이슈가 있는지 확인하려면 3번"
echo "                          "
echo -n  "원하는 작업을 선택하세요 "
read   aa
echo "                                        "
case  $aa  in
          1) sh /home/oracle/t.sh ;;
          2) sh /home/oracle/sar.sh ;;
          3) sh /home/oracle/o.sh ;;
esac
echo "                                 "

테이블 스페이스의 공간이 80이상이 차면, 자동으로 공간을 추가하는 쉘을 작성하시오!

$ vi tablespace.sql

begin
 for a in  (select * from ((select   t.tablespace_name,
                        ((t.total_size - f.free_size) / t.total_size) * 100 usedspace
                 from (select tablespace_name, sum(bytes)/1024/1024 total_size
                           from dba_data_files
                           group by tablespace_name) t,
                        (select tablespace_name, sum(bytes)/1024/1024 free_size
                           from dba_free_space
                           group by tablespace_name) f
           where t.tablespace_name = f.tablespace_name(+)))
         where usedspace >= 80 ) loop  
 
execute immediate 'alter tablespace' || a.tablespace_name ||
                  ' add datafile size 100m' ;
end loop;
end;
/
# execute immediate 절을 사용하면 PLSQL에서 DDL명령어를 수행할 수 있다. 

이거하고 스캇으로 접속해서
@tablespace.sql 돌리고

다시 orcl 돌아와서 sh.tablespace.sql 실행하고 1번눌러 현재 공간 확인한다.

✔️ 줄었다 !

문제 117. add_t.sh라는 이름으로 tablespace.sql을 scott 유저에서 수행하는 쉘스크립트를 만드세요.

$vi add_t.sh

export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리
export ORACLE_SID=orcl             #오라클 인스턴스 이름 (db이름)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈
export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정

sqlplus scott/tiger <<EOF

@/home/oracle/tablespace.sql

EOF
----------
$sh add_t.sh

문제 118. (리눅스 마지막 문제) dba.sh의 4번에 80% 이상 공간을 차지하고 있는 테이블 스페이스의 공간을 확보하는 아래의 스크립트를 수행하는 코드를 넣으시오 !

$ vi  dba.sh

#!/bin/bash

echo -e "
    
    aaa    a   aa     aaa       aaa     a      aaaa
   a   a   a aa      a   a     a        a     a    a
   a   a   aa            a     a        a     aaaaaa
   a   a   a         aaaaa     a        a     a
   a   a   a         a   a     a        a     a
    aaa    a          aaa       aaa     a      aaaa
 "
echo -e "========================================"
echo "                          "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번
 [2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번
 [3] 현재 데이터베이스에 이슈가 있는지 확인하려면 3번
 [4] 80% 이상 공간을 차지하고 있는 테이블 스페이스의 공간을 확보하려면 4번"
echo "                          "
echo -n  "원하는 작업을 선택하세요 "
read   aa
echo "                                        "
case  $aa  in
          1) sh /home/oracle/t.sh ;;
          2) sh /home/oracle/sar.sh ;;
          3) sh /home/oracle/o.sh ;;
          4) sh /home/oracle/add_t.sh ;;
esac
echo "                                 "

내일 오전에 리눅스 설치 위해 centos 설치파일을 다운로드 하기

오라클 virtual box 다운로드
cenos 7버젼 다운로드 ➡️ 요고만 하면됨

profile
Slow and steady wins the race.

0개의 댓글