그룹함수 (이채남 선생님 저 '오라클 실습' 참고)

2016. 1. 28. 23:47

-- 참고 자료

select * from temp;

19970101 김길동 74/01/25 AA0001 정규 Y 등산 100000000 부장

19960101 홍길동 73/03/22 AB0001 정규 Y 낚시 72000000 과장

19970201 박문수 75/04/15 AC0001 정규 Y 바둑 50000000 과장

19930331 정도령 76/05/25 BA0001 정규 Y 노래 70000000 차장

19950303 이순신 73/06/15 BB0001 정규 Y 56000000 대리

19966102 지문덕 72/07/05 BC0001 정규 Y 45000000 과장

19930402 강감찬 72/08/15 CA0001 정규 Y 64000000 차장

19960303 설까치 71/09/25 CB0001 정규 Y 35000000 사원

19970112 연흥부 76/11/05 CC0001 정규 Y 45000000 대리

19960212 배뱅이 72/12/15 CD0001 정규 Y 39000000 과장

*빈 값은 모두 NULL


-- 그룹함수          

-- (1)COUNT           

select count(*), count(8) from temp; -- 10, 10 

select count(*), count(8) from dual; -- 1,1 

--> *나 의미없는 값을 넣으면 row수만큼 읽어온다


select * from temp order by lev, hobby;

select count(emp_id), count(tel), count(hobby) from temp; -- 10, 0, 4

--> count() 괄호 안에 컬럼을 넣으면, 해당 컬럼이 null이 아닌 레코드의 개수를 읽어온다


select lev, 

count(*),  

count(hobby)

from temp

group by lev

order by lev;


-- 과장 4 2

-- 대리 2 0

-- 부장 1 1

-- 사원 1 0

-- 차장 2 1


--참고. GROUP 함수의 특징

select count(*) from temp

where hobby = '공부';

-- 또는

select count(hobby) from temp

where hobby = '공부';


-- count(*)

----------

-- 0

-- 1 row selected. --> 0 rows selected 가 아님. 해당 1개의 그룹(*group by 절이 없으므로 레코드 전체가 하나의 그룹)에 대해 1건의 결과를 출력하며, 그 그룹 중 '공부'가 취미인 레코드가 0개라는 1건의 결과를 출력함


select count(*)

from temp

where lev = '과장'

and salary >= 40000000;


select count(distinct lev) from temp;


-- min과 max

select min(emp_id) from temp;


select lev, min(emp_id)

from temp

group by lev;


-- 연습문제 그룹함수 연습

TEMP에서 직급별로 최소연봉을 가진 직원의 사번과 연봉을 읽어오자. (단,SUBQUERY를 사용하면 안 된다.)


select to_char(salary) from temp;

select lpad(to_char(salary),10,'0') from temp;

select min(lpad(to_char(salary),10,'0')) from temp;

select substr(min(lpad(to_char(salary),10,'0')||emp_id),11,8) EMP_ID from temp;

select lev, substr(min(lpad(to_char(salary),10,'0')||emp_id),11,8) EMP_ID, min(salary) SAL

from temp

group by lev;


-- SUM, AVG

-- 주의 : number type 컬럼만 인수로 받을 수 있다


-- 따라하기

select lev, count(*), sum(salary), avg(salary), sum(salary)/count(*) AVG2

from temp

group by lev;


-- 주의! 평균을 구할때는 NULL 값을 유의해야 한다.


--실험

select avg(salary) from temp; --57600000

update temp set salary = 0 where emp_name = '홍길동';

select count(salary), avg(salary), sum(salary)/count(*) AVG2 from temp; -- 10, 50400000, 50400000

update temp set salary = null where emp_name = '홍길동';

select count(*), count(salary), avg(salary), sum(salary), sum(salary)/count(*) AVG2 from temp; -- 10, 9, 56000000, 504000000, 50400000

--> 결국 avg(salary)= sum(salary)/count(salary) 로 구해진다는 것 (홍길동을 제외한 나머지 9명의 연봉 평균이 구해졌다.)

--> 전체 10명의 평균을 구하기 위해서는 nvl 함수를 사용해줘야 한다.

select avg(nvl(salary,0)) from temp; --50400000

rollback;


곰돌곰둘 Oracle_DB_Unix admin/미분류

데이터 형 변환 함수 (이채남 선생님 저 '오라클 실습' 참고)

2016. 1. 28. 22:55

-- 데이터형 변환함수

-- 기본 사항              

--          날짜 ---> 문자 ---> 숫자

--             TO_CHAR   TO_NUMBER


--          날짜 <--- 문자 <--- 숫자

--             TO_DATE   TO_CHAR


--          날짜  --/--> 숫자 (불가능)

--          날짜 <--/--  숫자 (불가능)


-- TO_CHAR(1)

-- 날짜를 문자로

-- 기본예제

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --2016-01-28 21:37:07

select to_char(sysdate,'YyyY') from dual; --2016

select to_char(sysdate,'YYY') from dual; --016

select to_char(sysdate,'YY') from dual; --16

select to_char(sysdate,'Y') from dual; --6

select to_char(sysdate,'SYEAR') from dual; -- TWENTY SIXTEEN

select to_char(sysdate,'YEAR') from dual; --TWENTY SIXTEEN

select to_char(sysdate,'Q') from dual; --1

select to_char(sysdate,'mm') from dual; --01

select to_char(sysdate,'month') from dual; --1월(January)

select to_char(sysdate,'mon') from dual; --1월(JAN)

select to_char(sysdate,'D') from dual; --5

select to_char(sysdate,'DD') from dual; --28

select to_char(sysdate,'DDD') from dual; --028

select to_char(sysdate,'DAY') from dual; --목요일 (Thursday)

select to_char(sysdate,'DY') from dual; --목 (THU)

select to_char(sysdate,'AM') from dual; --오후

select to_char(sysdate,'PM') from dual; --오후

select to_char(sysdate,'A.M.') from dual; --오후

select to_char(sysdate,'P.M.') from dual; --오후

select to_char(sysdate,'HH') from dual; --09

select to_char(sysdate,'HH24') from dual; --21

select to_char(sysdate,'MI') from dual; --37

select to_char(sysdate,'SS') from dual; --07


--응용

select to_char(sysdate,'DD') from dual; --28 --> 원본

select to_char(sysdate,'DDTH') from dual; --28TH (서수)

select to_char(sysdate,'DDSP') from dual; --TWENTY-EIGHT (숫자를 철자로)

select to_char(sysdate,'DDSPTH') from dual; --TWENTY-EIGHTH (서수를 철자로)

select to_char(sysdate,'DDTHSP') from dual; --TWENTY-EIGHTH (서수를 철자로2)


--따라하기

select to_char(sysdate,'yy/mm/dd') date1, --16/01/28

to_char(sysdate,'yyyy.mm.dd') date2, --2016.01.28

to_char(sysdate,'month dd.yyyy') date3, --1월 28.2016

to_char(sysdate,'DY DD MON YY') date4, --목 28 1월 16

to_char(sysdate,'Day Mon DD') date5 --목요일 1월 28

from dual;


-- 연습문제

select emp_name, emp_id, birth_date from temp; --> 생일과 요일 출력변환

select emp_name, emp_id, to_char(birth_date,'yyyy "년" month dd"일" Day') from temp; --> 정답



-- TO_CHAR(2)

-- 숫자를 문자로

select to_char(192939,'999999') from dual; --192939

select to_char(192939,'00000000') from dual; --00192939

select to_char(192939,'999,999') from dual; --192,939

select to_char(192.939,'999.99') from dual; --192.94

select to_char(192939,'$999999') from dual; --$192939

select to_char(192939,'L999,999') from dual; --         ₩192,939

select to_char(-192939,'999999MI') from dual; --192939- (마이너스표시)

select to_char(192939,'999999EEEE') from dual;   2E+05 (과학적표기)


--따라하기

select to_char(1234,'09,999') number1, --01,234

       to_char(1234.56,'99,999.99') number2, --1,234.56

       to_char(1234,'$99,999') number3, --$1,234

       to_char(1234,'L99,999') number4, --         ₩1,234

       to_char(-1234,'99,999MI') number5 --1,234-

       -- to_char(-1234,'99,999EEEE')

       from dual;

       

--연습문제

select salary,

       to_char(salary, '099,999,999') SAL1,

       to_char(salary, '999,999,999.00') SAL2, 

       to_char(salary, '$999,999,999') SAL3,

       trim(to_char(salary, 'L999,999,999')) SAL4,

       to_char(salary, '999,999,999') SAL5 ,

       to_char(salary, '99EEEE') SAL6

       from temp;


       

--TO_NUMBER

--문자를 숫자로(O)

--날짜를 숫자로(X)


--따라하기

select to_number('123456') TONUM1, --123456

       to_number('123,456','999999') TONUM2 --123456

       from dual;


       

--TO_DATE

--문자를 날짜로(O)

--숫자를 날짜로(X)


select to_date('1997-12-31 13:33:44','yyyy-mm-dd hh24:mi:ss')

from dual; -- 97/12/31


select round(sysdate - to_date('19700101','yyyy-mm-dd')) "며칠"

from dual; --16829


--1970년 1월 1일 00시00분00초에서 946075441초가 지나면??

select to_date('19700101000000','yyyymmddhh24miss') +

           946075441 / (24*60*60)

           from dual; -- 99/12/24

곰돌곰둘 Oracle_DB_Unix admin/미분류

날짜 함수 (이채남 선생님 오라클 실습 2장 중)

2016. 1. 27. 23:06

-- 1. date type + date type 의 가산은 불가능

select sysdate + birth_date

from temp

where emp_name = '홍길동';


-- 2. date type - date type 의 감산은 가능

select emp_name, sysdate-birth_date from temp

where emp_name = '홍길동';


-- 3. date type에 number type을 더하거나 빼서 날짜 계산이 가능

select emp_name, birth_date, birth_date + 1.5, birth_date - 1.5

from temp

where emp_name = '홍길동';


-- * sysdate는 초단위까지 계산되지만 기본적으로 년/월/일만 출력됨

select sysdate from dual;


-- 4. date type 출력 형식 지정 및 시, 분, 초 계산

select to_char(sysdate,'HH24:MI:SS') AS TIME,

       to_char(sysdate + 14/24, 'HH24:MI:SS') AS "14시간 후",

       to_char(sysdate + 30 / (24*60) , 'HH24:MI:SS') AS "30분후",

       to_char(sysdate + 50 / (24*60*60), 'HH24:MI:SS') AS SEC from dual;

       

-- 5. 날짜 함수의 활용 (1) ADD_MONTHS

select sysdate,

       add_months(sysdate,1), -- 한달 더하기

       add_months(sysdate,-13) -- 13개월 빼기

from   dual;


-- 6. 날짜 함수의 활용 (1) MONTHS_BETWEEN

select months_between(sysdate,birth_date) MON_TERM

from  temp

where emp_name = '홍길동';


-- 7. 연습문제 : ADD_MONTH 함수의 사용

select emp_name, round(months_between(birth_date,sysdate)) MONTHS,

       to_char(birth_date,'yyyy-mm-dd') BIRTH,

       to_char(add_months(sysdate,months_between(birth_date,sysdate)),'yyyy-mm-dd') TO_YE1,

       to_char(add_months(sysdate,trunc(months_between(birth_date,sysdate))),'yyyy-mm-dd') TO_YE2,

       to_char(add_months(sysdate,round(months_between(birth_date,sysdate))),'yyyy-mm-dd') TO_YE3 from temp;

       

-- 8. LAST_DAY --> 해당 월의 말일 산출

select emp_name, birth_date, last_day(birth_date)

from temp;

곰돌곰둘 Oracle_DB_Unix admin/미분류

Unix Admin (6) 프로세스, 데몬, 서비스

2015. 12. 22. 15:42

# 프로세스란?

 하드 디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화된 것.

 백그라운드 프로세스: 실행은 되었지만 사용자와 상호작용하지 않고 있는 프로세스

  --> 작업번호로 signal을 주거나, kill 명령어로 signal을 줄 수 있다.

예) kill %job#

    kill -9 pid# (kill -sigkill pid#)

PID = Process ID

PPID = Parent Process ID (부모 프로세스 ID)

 *kill --> signal을 보내는 명령어



참고) ulimit 명령어로 시스템 리소스의 제한 수치를 볼 수 있다.

ulimit -a

ulimit

ulimit -l

ulimit -u 5(프로세스 수치 제한)


#ps (프로세스 모니터링) 

대게 ps -ef 명령어로 모든 명령어에 대한 자세한 사항을 확인한다.


ps -a 터미널에 물려 있지 않고 서버 독자적으로 수행되는 프로세스를 보여줌

ps -u 자신과 관련된 프로세스만 보여줌

ps -e (ps -A) 모든 프로세스 보여줌

ps -x 모든 프로세스를 보여주나, 필드가 다소 다름

ps -f 자세하게 (full-format listing)

ps -t 지정 터미널과 관련된 프로세스

pstree --> 부모프로세스와 자식프로세스 관계를 트리 형태로 보여줌



곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

Unix Admin (5) 정규식, pipe, filter, redirection, VI(VIm)

2015. 12. 22. 15:08

정규식 (Regular Expression)

  유닉스 시스템에서 검색을 목적으로 활용


grep [ba]g test

 --> grep bg test 이거나

      grep ag test 인것을 모두 출력 (UNION)


-- 실습

(참고) set list --> 각 행의 마지막을 표시($)



파이프 (pipe)

파이프 문자 앞의 명령어의 표춘 출력을 파이프 뒤의 명령어의 표준 입력으로 전달해 줌



필터(filter)

grep, tail, wc, sort, awk, sed


#wc

wc 파일이름 (no option) line수, word수, byte 를 차례로 출력

wc -l 파일이름 --> line 수

wc -w --> 워드수

wc -c --> byte수

wc -L --> line중 가장 긴 line의 length


활용예) 특정 디렉터리의 파일 및 디렉터리 개수 확인

ls -l /etc | wc -l


 

#리다이렉션

표준 입력, 출력, 에러의 방향을 바꿔줌

표준입력 : 0

표준출력 : 1

표준에러 : 2



cf) sort 명령어

기본적으로 ASCII 코드에 따라 정렬.



#Vi(Vim)

--Vi의 Mode

      EX (명령 모드)    <-->   Normal    <-->   Insert (편집 모드)

-- 다른 이름으로 저장

:wq new_name.txt


-- visual mode (마우스 세팅)

:set mouse=a


-- 여러 창을 동시에 닫을때 qa!


#tag, jump

Ctrl+] ==> 특정 목록(tag)로 이동

Ctrl+O ==> go further back

Ctril+T ==> repeat 


#복사하기, 붙여넣기 (visual mode)

v --> 선택 부분부터 라인 단위로 선택할 수 있음

ctrl+v --> 선택 부분부터 블럭 단위로 선택할 수 있음


y == 복사하기

p == 붙여넣기


#Vim Configuration file (Vi 환경설정 파일 만들기)


vi ~/.vimrc

set nu

set list

:wq


--> :set

세팅된 환경설정을 볼 수 있다.


:version

vi 버전확인


#Vi Navigation (Basic)

Ctrl+E 한 라인씩 내리기

Ctrl+Y 한 라인씩 올리기


w --> 한 단어씩 건너뛰기

W --> 한 단어씩 건너뛰기 (각종 구분자 무시)

e --> 한 단어씩 건너뛰기 (맨 뒷문자)

E -->  한 단어씩 건너뛰기 (맨 뒷문자, 각종 구분자 무시)

b --> 한 단어씩 거꾸로 

B --> 한 단어씩 거꾸로 (각종 구분자 무시)

==> ※대문자는 특수문자까지 묶어서 하나의 word로 인식한다는 것 (공백을 기준으로 이동)


0 --> 라인의 맨 앞으로 오기 (공백포함)

$ --> 라인의 맨 뒤로 가기

^ --> 라인의 맨 앞으로 오기 (라인 첫번째 문자까지)


{ --> 패러그래프 단위로 올라가기

} --> 패러그래프 단위로 내려가기

[[ --> 섹션 단위로 올라기

]] --> 섹션 단위로 내려가기

( --> 문장 단위로 올라가기

) --> 문장 단위로 내려가기


#Vi Navigation (Advanced)

페이지 안에서 커서만 이동하기

H, M, L


커서를 기준으로 스크롤 하기

z (enter) , z (.)(-)


(일반모드)

gg(1G) --> 해당 파일의 시작지점으로 가기

G --> 해당 파일의 끝으로 가기

##% --> 해당 파일의 %부분으로 이동


(명령모드)

:#G (enter) --> #번으로 가기

:0 (enter) --> 첫번째 줄로가기

:$ (enter) --> 맨 끝 줄로가기


set numberwidth=# --> 행 번호 숫자 앞의 여백 크기를 #으로 조절하기



#Vi Navigation (Expert)

:jumps (enter) 자동 북마크(점프) 내용보기

CTRL+O             go further back

CTRL+I              repeat

(여러 파일간에도 적용가능하다)

※jump주소는 상대주소로 매겨짐 (jumps 할때마다 바뀜)


vi +143 README ==> 143번줄부터 열기

vi +/kernel README ==> 위에서부터 첫번째 찾은 kernel 부터 열기

vi +?kernel README ==> 아래서부터 첫번째 찾은 kernel 부터 열기


(응용: 정규표현식 사용)

vi +/^linux /etc/passwd ==> 행 첫번째가 linux인 가장 첫번째 행에서 열기


-- 수동 북마크 하기 (파일 하나)

북마크하기 --> m a (a가 북마크 이름임)

북마크 a 찾아가기 --> ' a (북마크 한 행의 공백없는 가장 첫번째 문자로)

                         ` a (북마크 한 바로 그 컬럼으로 이동)

북마크보기 --> :marks


-- 수동 북마크 하기 (다중 파일)

예제)

vi /etc/passwd /etc/group

글로벌 북마크 하기 --> m P (대문자로)

북마크 P 찾아가기 --> ' P 또는 ` P



#.viminfo 확인하기


vi ~/.viminfo


글로벌 마크, 개별 파일 마크 확인

글로벌 점프, 개별 파일 점프 확인



2일차캡쳐.zip



# vi 명령어

vi -R filename / view filename --> 읽기전용으로 열기

복사 yy

커서 아랫줄에 붙여넣기 p

커서 윗줄에 붙여넣기 P


vi에서 삭제는 잘라내기와 같다.

한줄 잘라내서 아랫줄에 붙여넣기 dd p

한줄 잘라내서 윗줄에 붙여넣기 dd P

한 글자 잘라내서 커서 앞에 삽입 P

한 글자 잘라내서 커서 뒤에 삽입 p

deep --> 두 워드를 잘라내기

! tip (공백에 두고 하면 된다)

! 원리

 d --> 지우겠다

 e --> 해당 단어의 마지막 글자로 이동

 e --> 다시 해당 단어의 마지막 글자로 이동

 p --> 붙여넣기


p, P --> 버퍼에 있는 내용을 붙여넣는것!


#Search 기능

예제) 아래로 찾기 (위로 찾기)

/(?)

linux

n

n

...

* n대신 / (enter), ? (enter)도 가능하다. 단 이건 새로 Search 하는 것임. (효과는 동일)

* 찾단 방향과 역순으로 찾으려면 N N N...


#약어 입력

: ab short long

  --> long에 대해 short으로 약어 설정하기

설정된 약어 보기 : ab (enter)


#줄바꿈 r (enter) --> tip 커서가 위치한 글자가 사라지므로 공백에서 실행할 것

J --> 줄 붙이기


#커서 이동2

공백을 제외한 윗 라인으로 이동

+

공백을 제외한 아래 라인으로 이동

0 --> 해당 라인의 첫번째로 이동 (공백포함)


#잠깐 vi pause 하고 다른 UNIX 명령어 수행

:! (명령어) (enter)

아까 실행했던 명령어 다시 실행

:!! (enter)


#vi 편집중 sh(쉘) 수행하기

:sh (enter)

끝나고 exit (enter) --> vi로 돌아옴

bash 쉘 수행하기

:!bash (enter)

끝나고 exit (enter)


#패턴에 의한 치환

:s/aaa/kkk --> 커서가 위치한 한 줄만 적용됨

여러줄 한번에 적용하기

:1,5s/aaa/kkk --> 1~5줄에 위치한 aaa를 kkk로 변경함

:1,$s/aaa/kkk --> 전체줄에위치한 aaa를 kkk로 변경함

단, 각 줄에 있는 첫번째 패턴밖에 안 바뀐다

전체를 바꾸려면 

:1,$s/aaa/kkk/g

* 참고 :1,$s --> :%s로 쓸 수 있음

확인하면서 바꾸기

:%s/aaa/bbb/c


#data 읽어 오기

:7 r data.txt

-->7번째 줄 아래에 data.txt 내용 삽입 

:r data.txt

--> 번호를 생략할 경우 커서 바로 아랫 line에 내용 삽입

:6 r !ls -l

--> 6번째 line 밑으로 ls -l에 대한 표준 출력 값을 삽입


#삽입(insert, 편집모드)모드로 전환

I --> 현재 line의 가장 앞에 삽입 (공백제외)

A --> 현재 line의 가장 뒤에 삽입 (공백제외)


#수정 완료 후 새 파일 편집하기

e filename 

! tip 현재 파일의 수정 사항을 저장 후 실행해야 함 (아니면 e! 로 강제 종료 가능)


#문자열 수정하기

r 한 글자만 변경

R 커서가 위치한 곳부터 수정모드로 변경

s --> x+i (한 글자 삭제 후 편집모드로 변경)

C --> d+$+a (해당 line에서 끝글자까지 삭제 후 커서가 위치한 곳에서 부터 삽입모드로 변경)

cc 또는 S --> dd+i

~ --> 커서가 위치한 곳의 대.소문자 변경


[visual mode 한정]

:set mouse=a

커서 이동 후 c --> 블록 처리된 곳까지 삭제 된 후 편집모드로 변경됨


#문자열 삭제하기

X --> 커서의 왼쪽 문자 삭제

D --> 커서부터 해당 line 끝까지 삭제 (공백포함)

dG --> 커서가 있는 line 포함하여 파일 끝까지 삭제

d1G --> 커서가 있는 line 포함하여 파일 맨 앞까지 삭제

:line#a d (enter) --> a번 줄 삭제

:line#a, line#b d (enter) --> a번줄 ~ b번줄 전체 삭제


[visual mode 한정]

:set mouse=a

커서 이동 후 d --> 블록 처리된 곳까지 삭제



# 여러줄의 복사와 이동

line#a co line#b --> a번 줄을 b번줄 아래에 복사

line#a, line#b co line#c --> a번 ~ b번줄 전체를 c번줄 아래에 복사
line#a mv line#b --> a번 줄을 잘라내서 b번줄 아래에 붙여넣기
line#a, line#b m line#c --> a번 ~ b번줄 전체를 잘라내서 c번줄 아래에 붙여넣기


#데이터 처리하기

:.![unix명령어] (enter) --> unix명령어 결과를 해당 line부터 출력


#tab 사용하기

(편집모드에서) Ctrl+T == Tab키 --> indent 늘리기

Ctrl+d == indent 줄이기


#여러창 동시에 사용하기

:new [창 이름]

Ctrl+ w, w --> 창 전환하기 (순환식)

Ctrl+ w, j --> 창 전환하기 (아래창으로, 순환 X)

Ctrl+ w, k --> 창 전환하기 (위 창으로, 순환 X)

곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

Unix Admin (4): 관리 명령어

2015. 12. 22. 13:13

#tar

옵션

* 여러 파일을 하나의 파일로 압축하기 위해서는 우선 tar 명령어를 통해 묶어야 한다.

- f : 묶음 파일명 지정, 생략시 tape로 백업


참고) 파일 정보 확인 --> file 파일명



#top

CPU를 사용하는 프로세스를 확인

top 실행 중 i --> 유휴(idle) process는 보여주지 않음

  *idle process : memory에 프로그램이 올라와 CPU가 실행할 수 있는 상태이나, 현재 사용되고 있지 않는 프로세스 ==> wait queue에 있는 process

  * run queue

  * wait queue 

d --> refresh 시간을 조정

u --> 특정 user만 모니터링

c --> 실제로 실행된 명령행까지 모니터링

f --> top에 표시되는 필드(컬럼)을 수정할 수 있음

h --> 도움말 보기

 

#find

find [경로][옵션][조건]


예제) find /home -name aaa

/home 경로 밑에서 파일명을 조건으로 파일명이 aaa인 파일을 찾겠다.


find /home -user linux

/home 경로 밑에서 유저명을 조건으로 소유자가 user인 파일을 찾겠다.

응용1 (파이프 이용)

find /home -user user2 | ls -la


응용2 (-exec 이용)

find ./ -perm 775 -exec ls -ld {} \;


#which

PATH에 설정된 디렉토리만 검색


실습 예제)

linux@linux-VirtualBox:~/find$ cat > main.c

#include <stdio.h>

int main()

{

  printf("Hello World!\n");

  return 0;

}

linux@linux-VirtualBox:~/find$

linux@linux-VirtualBox:~/find$

linux@linux-VirtualBox:~/find$

linux@linux-VirtualBox:~/find$ cat main.c

#include <stdio.h>

int main()

{

  printf("Hello World!\n");

  return 0;

}

linux@linux-VirtualBox:~/find$ gcc -o abk main.c


abk --> 안됨


--PATH 등록하기
PATH=$PATH:.


./abk

--> Hello World!


which abk

--> ./abk


cd ..

which abk

--> 없음


abk

--> 오류발생


==> 상위 디렉터리에서는 오류가 발생한다.


--PATH 다시 등록

PATH=$PATH:/home/linux/find


which abk

--> /home/linux/find/abk


abk

--> Hello World!


※PATH의 의미: 특정 명령어를 실행할 경우, OS는 PATH에 설정된 디렉터리들을 순서대로 조회하여 해당 명령어가 있는지 조사 한후, 해당 명령어가 있을 경우 실행해준다.


#grep

특정 문자열(패턴)이 어느 파일의 어느 부분에 있는지를 검색

grep <찾는내용> <파일이름>

grep은 해당 문자열(패턴)이 있는 라인 전체(한 줄)을 출력한다.


예제) grep user /etc/passwd


참고) 리다이렉트 - (파이프, |)

ls -l

--> 표준 출력

ls -l | grep main

표준출력을 grep의 입력으로 보내겠다. (ls -l의 결과가 하나의 txt 파일이라고 볼 수 있음)


응용)

linux@linux-VirtualBox:~/src/linux-4.3.3/init$ find . -user linux -exec grep start_kernel {} \;

--> 이건 됨
--> find로 찾은 각각의 파일명이 {}에 인수로 들어가서 전체 파일 개수 n개 만큼 n번 반복해서 grep 명령이 수행된다고 볼 수 있다.
 * find -exec <command> \; --> 찾은 파일 대상으로 특정 명령을 수행하기 때문.
 cf) 어떤 파일이 해당 문자열을 갖고 있는지 찾으려면 ?
  --> grep start_kernel *

linux@linux-VirtualBox:~/src/linux-4.3.3/init$ find . -user linux | grep start_kernel

--> 이건 안됨


*간단히, 특정 이름의 파일을 찾을 때는 | (파이프)를, 내용에 특정 문자열이 있는 파일을 찾으려면 -exec를 이용하면 된다.


-- 대소문자 구분없이 찾기

linux@linux-VirtualBox:~/find$ grep variable *

aaa.c:variable


linux@linux-VirtualBox:~/find$ grep -i variable *

aaa.c:variable

bbb.c:VARIABLE


linux@linux-VirtualBox:~/find$ grep -i VARIABLE *

aaa.c:variable

bbb.c:VARIABLE


grep -R --> 현재 디렉토리 뿐만 아니라 하위디렉터리까지 조회하는 옵션


곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

UNIX Admin(3) 사용자 관리와 파일 속성

2015. 12. 21. 17:58

참조) 정규식 예제

ls -l | grep ^l --> l로 시작하는 행 모두 출력


#파일과 디렉토리의 소유와 허가권

파일 생성 시 기본적으로 권한이 666으로 생성됨 (-rw-rw-rw-)

하지만 umask에 설정된 값에 따라 권한이 - 되어 생성되게 된다.

예) umask 0022일 경우 --> 644 (-rw-r--r--)



#하드링크와 소프트링크

* 하드링크

하드링크는 링크수가 0이 될때 실제 파일(데이터)이 삭제된다.

하드링크는 inode가 같다.

하드링크는 inode를 공유하기 때문에, 같은 File system일 때에만 적용할수 있다.

반면에 소프트링크는 다른 File system간에도 설정할 수 있다.

곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

Unix Admin(2)기본 명령어 실습

2015. 12. 21. 17:22

(1)실습환경구성

  1. 버츄얼 박스 설치

  2. 리눅스 설치 (15.04)

  3. Putty 환경구성

    언어설정(키보드)

    sudo passwd

    장치 --> 게스트 확장 CD이미지 삽입 (root계정으로 reboot) -->이걸 설치해야 Virtual Box 화면 크기로 볼수 있음. --> 완료후 CD 꺼내기

     SSH 설치

   --  sudo apt-get install ssh (root계정으로 스위치 한뒤 ssh를 설치하게 됨.) --> 완료

     vi 업데이트

   -- apt_get install vim --> 완료

   -- vi /etc/ssh/sshd_config(root로 수정) --> putty로 원격접속 할때 root계정으로 접속할 수 있도록 설정하려는 것임. --> 데몬 재기동 (service ssh restart)

  -- IP 확인 후 putty로 접속하기

  -- ifconfig

  -- UTP8로 변경(putty)

   4. 기타환경구성

      tree설치 

     apt-get install tree

     --> tree 실행


*Fedora : 모든 기능이 포함되어 있으므로 용량이 큼, 따로 다운로드 받을 필요가 없음.

*Ubuntu : 자동업데이트 체크안함(권장) 

  --> 터미널 실행 : ALT+CLT+T


# 시작과 종료

모드 전환 (F1~F6, F7)

Ctrl+Alt+F1~F7

--> F7은 윈도우 창


종료

shutdown -h now --> 바로 끄는것

shutdown -h 10 ==> 10 분후에 종료예약

 취소시? shutdown - c ==> 걸려있던 모든 shutdown예약이 취소됨.

  (*shutdown -r 로 걸려 있는 리부팅 작업도 포함함)




# 계정 추가 및 삭제

adduser test1 ==> 계정추가

계정 추가시 등록되는 곳. --> /etc/passwd

  ** 실제 비밀번호가 등록되는 곳 --> /etc/shadow

자기계정보기 : whoami

  ** /etc/passwd에 설정된 home directory 가 없을 때는 (ubuntu에서는) root가 pwd가 됨.

  


userdel test2 ==> 계정 삭제

* 계정 삭제 시 주의 : 사용중인 계정은 삭제할 수 없다. 또한 root가 아닌 일반 계정은 userdel 명령에 권한이 없다. --> 사용중인 계정 삭제 --> -f 옵션

userdel 명령으로 계정 삭제 시에도 해당 home directory는 남아 있다.

--> 해당 home 디렉터리까지 삭제 --> -r 옵션



adduser VS useradd

useradd --> 계정만 생성 (/etc/passwd) : 홈 디렉터리 및 비밀번호 (/etc/shadow)는 따로 설정해줘야 함

adduser --> 계정 생성시 /etc/passwd, /etc/shadow, home 디렉터리 설정까지 완료해줌 



#Unix/Linux 기본명령어

 특징

 * 대소문자의 구분

 * 여려 명령의 동시 수행 가능 (예: cal; date)

 * 파일 사용권한의 구분

 * 내부명령어(built-in)와 외부명령어(쉘 프로그래밍)로 구분됨

 * 명령어 사용 형식 : 명령어 [옵션] [인수]


#date

date --> linux 설치 시 설정된 시간이 표시됨

date -I --> YYYY-MM-DD

date -u --> 그리니치 천문대 시각(세계표준시)

date --v, date --version ==> linux 버전을 보여줌


#who

접속된 계정 정보를 보여줌

접속모드, user명, ip 정보등을 출력


#cal

cal -3 (앞 달, 뒷달까지)

cal -y (해당 년 12달 전체 보여줌)


#su - (계정명)

su -, su 로 계정명 생략 시 root로 전환 가능

*root 유저는 일반 유저로 switch 시 pw가 필요치 않음


#ls

해당 디렉터리 안의 파일목록을 나열 (*디렉터리까지)

ls /usr/bin --> /usr/bin 안의 파일목록을 나열

ls -a --> 숨겨진 파일을 보여줌

ls -l --> pwd의 파일 정보를 목록형으로 자세히 보여줌 (long format)

  ** 디렉터리 자체에 대한 권한을 보기 ls -ld /usr/bin

  ** 디렉터리에 대한 r, w, x 권한

    r --> 디렉터리 안의 파일 내용에 대한 조회 가능

    w --> 디렉터리 안에 파일 생성 가능, 디렉터리 삭제 가능

    x --> 디렉터리에 cd 가능

ls -i --> 파일의 inode번호를 알 수 있음


#cd

*상대경로와 절대경로 개념을 숙지해야 함.


cd ~user1 --> user1의 home directory로 이동

-rwxr-xr-x 1 root root      37808  8월 16  2013 xprop


cd --> 자신의 홈디렉터리로 이동 (cd ~와 동일)

첫번째 필드 : 파일 형식 (6가지)

- 일반파일
d 디렉토리
c 캐릭터 디바이스
b 블럭 디바이스
p 파이프
l 링크

2~ 10번째 필드 : 파일 권한
자신, 그룹, Other


11번째 필드 --> 

12번째 필드 --> 소유자

1일차캡쳐.zip


13번째 필드 --> 파일크기


#pwd

현재 경로를 출력


#rm

현재 파일을 삭제


예제 파일 작성

$ cat > abc.txt

this is a abc.txt file

ctrl+D

(ctrl+D ==> End Of File, EOF. 이걸 입력하면 입력이 종료되었음을 알려줌)


*cat (노 옵션시) ==> Copy standard input to standard output


rm -r --> 해당 디렉터리 및 디렉터리 안의 파일 모두 삭제


*지우려는 파일이나 디렉토리에 삭제 권한(w)이 있어야 함.

만약 해당 디렉터리에 w권한이 없다면, 그 안의 어떤 파일(디렉터리)에 대해서도 삭제할 수 없다.

예) ~/aaa/bbb

aaa는 bbb디렉터리의 inode에 대한 정보를 갖고 있으므로, 만약 bbb디렉터리를 삭제하게 된다면 aaa디렉터리의 내용도 변경해줘야 함. 따라서 w권한이 필요함.


#cp

*새로 복사한 파일은 사용자의 소유가 됨


*디렉터리에 대한 복사

cp -r 옵션을 주지 않으면 디렉터리는 복사할 수 없음

경우에 따라 결과가 다르다


경우1)

Before

.

├── aaa

│   └── test.txt

├── cba.txt

└── examples.desktop


cp -r aaa bbb


After

.

├── aaa

│   └── test.txt

├── bbb

│   └── test.txt

├── cba.txt

└── examples.desktop


경우2)

Before

.

├── aaa

│   └── test.txt

├── bbb

│   └── test.txt

├── cba.txt

└── examples.desktop


cp -r aaa bbb


After

.

├── aaa

│   └── test.txt

├── bbb

│   ├── aaa

│   │   └── test.txt

│   └── test.txt

├── cba.txt

└── examples.desktop


참고) cp 명령은 복사이기 때문에 기존 존재하던 abc.sql이 삭제 되지 않았음.

├── aaa
│   └── test.txt
├── bbb
│   └── abc.sql
├── cba.txt
└── examples.desktop

cp -r aaa bbb


├── aaa
│   └── test.txt
├── bbb
│   ├── aaa
│   │   └── test.txt
│   └── abc.sql
├── cba.txt
└── examples.desktop


참고2) cp -r 명령으로 디렉터리 복사시 path가 동일하더라도 overwrite 되지 않는다.

단, 노 옵션으로 cp로 파일을 복사하면, overwrite된다.


#touch

 * 파일이 없으면 size가 0인 파일을 생성

 * 파일이 있으면 수정 시간을 현재 시간으로 변경함. (파일 내용은 변경 되지 않음)


#mv

 파일이나 디렉터리의 path를 변경

 여러개의 인수를 동시에 지정시, 맨 마지막 인수는 existing directory만 지정 가능

 

#cat

cat test.sql --> test.sql 파일의 내용을 화면에 표준출력

cat > test.sql --> 표준출력을 test.sql로 리다이렉트. 기존에 파일이 없다면 파일을 생성한다. 기존에 파일이 있다면 overwrite한다.

cat >> test.sql --> 표준출력을 test.sql로 리다이렉트. 기존에 파일이 없다면 파일을 생성한다. 기존에 파일이 있을 경우 기존 text에 붙인다.


cat -n --> 파일 내용을 표준 출력하는데 각 행마다 number를 붙인다.

cat -b --> 파일 내용을 표준 출력하는데 각 행마다 number를 붙인다. 단, 공란 제외

cat -nb <==> cat -b


#more

실습환경 구성 (wget 실습)

1) https://www.kernel.org/ 접속

2) Stable : 4.3.3 의 tar.xz 파일을 오른쪽으로 클릭 후 '링크 주소 복사'



3) Putty에서 사용자 계정(예: linux)의 home directory로 접속후, mkdir src로 디렉터리 생성

cd src로 이동

(4) ~/src에서 wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.3.3.tar.xz 실행

(5) download가 시작된다 (인터넷에 연결되어 있어야 함)



(6)압축해제 후 README 파일로 more를 실습한다.



#head

문서의 윗줄부터 n줄까지만 보여준다. -number 옵션으로 조절가능하며, default값은 10.

head -3 /etc/*.conf ==> 모든 *.conf파일들을 위에서부터 3줄씩만 보여준다.


#tail

문서의 아랫줄부터 n줄까지만 보여준다. -number 옵션으로 조절가능하며, default값은 10.

tail -f 파일명 ==> 해당 파일의 추가되는 아랫줄을 계속해서 덧붙여서 refresh 해준다.

곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

UnixAdmin (1)

2015. 12. 21. 10:33


곰돌곰둘 외부교육정리/4.UNIX Admin (2015.12)

데이터 형 변환이 일어나는 예

2015. 10. 25. 21:50

쿼리를 작성할 때 사실 잘 의식하지는 못하는 부분이지만, 오라클이 query를 수행하는 과정에서 형 변환은 자주, 끊임없이 일어나고 있다. 이채남 저 '오라클 실습'에서 소개한 예제를 여기에 정리하고자 한다.


형변환 사례 1) CONCAT 또는 합성연산자 ||의 사용 시


select emp_id || emp_name from temp;

CONCAT또는 합성연산자는 두개 이상의 문자열을 하나의 문자열로 묶어주는 함수이다.

emp_id가 number type이기 때문에, 이때 오라클은 자동으로 number --> 문자(char? varchar2?)로 형변환을 시켜준다. 즉 위의 쿼리는 다음과 같이 처리가 되게 된다.

(1) 형변환(숫자 to 문자) --> (2)문자열 합성


형변환 사례 2) number type에 문자열 함수를 사용할 경우

위의 사례보다 더 중요하게 생각되는 사례 인데, 예를 들어 다음 쿼리를 보자.


select emp_id, emp_name

from temp

where substr(emp_id,1,4) + 1 = 1998;

emp_id의 첫번째 4자리에 1을 더한 값이 1998인 사원의 사번과 이름을 출력하는 쿼리인데, 문제는 emp_id는 number type인데 substr은 문자열 함수라는 것이다.

따라서 오라클은 위의 쿼리를 수행하기 위해 다음과 같이 형변환을 수행한다.


(1)형변환(숫자 to 문자) -->            (2) substr함수 수행 -->  (3)형변환 (문자 to 숫자) --> (4) 연산

19970101(숫자) --> 19970101(문자)  -->   1997(문자)  -->  1997(숫자)     --> +1 연산 --> 1998(숫자)


두번의 형변환이 일어났는데, 두번째 형변환은 당연히 +1이라는 연산을 수행해주기 위해 일어난 것이다. 비교 대상인 값인 =1998은 숫자로 쓰인 것이므로 세번째 형변환은 일어나지 않는다. 만약 쿼리를 다음과 같이 썻다면, 세번째 형 변환도 일어날 것이다.


select emp_id, emp_name

from temp

where substr(emp_id,1,4) + 1 = '1998';


정리해보니 사실 사례 1과 2는 같은 사례였구나..

이 외에도 형변환의 사례를 찾는다면 이 포스팅을 계속 업데이트 하고 싶은 바람이다.

곰돌곰둘 Oracle_DB_Unix admin/미분류