# 리눅스 기본 자바 버전
[root@centos ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)


# 시스템 환경 설정 파일
시스템을 사용하는 전체 사용자의 공통 환경을 설정하는 파일로 모든 사용자가 로그인할 때 무조건 실행
/etc/profile
/etc/bashrc


# 사용자 환경 설정 파일
각 사용자의 홈 디렉터리에 숨김 파일로 있으며 사용자가 내용을 수정하고 관리한다.
사용자가 로그인하면 제일 먼저 시스템 환경 설정 파일이 실행되어 시스템 공통 환경을 만들고 이 후 사용자 환경 설정 파일을 순서대로 실행하여 사용자별 환경을 설정한다.
.bash_profile
.bashrc
.bash_logout


# JAVA 환경변수 설정
[root@centos ~]# vi .bash_profile        # 편집
export JAVA_HOME=/usr/java/jdk1.8.0_131
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
:wq
[root@centos ~]# source .bash_profile        # 적용


# 체크
[root@centos ~]# echo $JAVA_HOME
/usr/java/jdk1.8.0_131

[root@centos ~]# cd $JAVA_HOME
[root@centos jdk1.8.0_131]#

[root@centos ~]# javac
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
...

[root@centos ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
>>> 설정했지만 기본으로 지정안되어있다.


# 기본 jdk 변경
[root@centos ~]# which java
/bin/java

[root@centos ~]# update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk1.8.0_131/bin/java" 1
[root@centos ~]# update-alternatives --config java
...
   3           /usr/java/jdk1.8.0_131/bin/java
>>> 3

[root@centos ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
>>> root 계정에서 자바 변경 완료


[user1@centos ~]$ cd $JAVA_HOME
[user1@centos ~]$ pwd
/home/user1
[user1@centos ~]$ echo $JAVA_HOME
bash: eco: command not found...
Similar command is: 'java'
>>> 유저계정에는 환경설정이 안되어있다.


# 유저에서 JAVA 환경변수 설정
[user1@centos ~]$ vi .bash_profile        # 편집
export JAVA_HOME=/usr/java/jdk1.8.0_131
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
:wq
[user1@centos ~]$ source .bash_profile        # 적용(리로드)

[user1@centos ~]$ echo $JAVA_HOME
/usr/java/jdk1.8.0_131                    # 접속가능

[user1@centos ~]$ cd $JAVA_HOME
[user1@centos jdk1.8.0_131]$

[user1@centos ~]$ javac
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
...



# JAVA TEST
[user1@centos ~]$ vi Hello.java        # 신규 편집
class Hello{
        public static void main(String arg[]){
                System.out.println("Hello Java");
        }
}

[user1@centos ~]$ javac Hello.java     # Hello.class 생성
[user1@centos ~]$ java Hello           # 실행
Hello Java





# emp.csv -> user1 복사 해두자

[user1@centos ~]$ head emp.csv
"EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID"
100,"Steven","King","SKING","515.123.4567",2003-06-17,"AD_PRES",24000,,,90
101,"Neena","Kochhar","NKOCHHAR","515.123.4568",2005-09-21,"AD_VP",17000,,100,90
...






■ cut
문자열 자르기

-d 필드 구분자
-f5 추출 열(칼럼)


[user1@centos ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
[user1@centos ~]$ cat /etc/passwd | cut -d: -f1
root
bin
daemon
adm
...


[user1@centos ~]$ cat /etc/passwd | cut -d: -f1,3
root:0
bin:1
daemon:2
adm:3
...


[user1@centos ~]$ cat /etc/passwd | cut -d: -f1 > users.txt


[user1@centos ~]$ cat emp.csv | cut -d, -f1,3,5,6
"EMPLOYEE_ID","LAST_NAME","PHONE_NUMBER","HIRE_DATE"
100,"King","515.123.4567",2003-06-17
101,"Kochhar","515.123.4568",2005-09-21
102,"De Haan","515.123.4569",2001-01-13
...





■ awk
특정 단어가 들어가있는 라인에서 특정 컬럼명을 출력하고자 할 때 사용하는 명령어

-F 필드 구분자
$5 추출 열(칼럼)
-v 외부변수 사용
-v 변수명=$외부변수명


[user1@centos ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
[user1@centos ~]$ awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
...



■ 연산자
1. 산술연산자 : +, 1, *, /
2. 비교연산자 : =, !=, >, >=, <, <=
3. 논리연산자 : &&(and), ||(or), !(not)

[user1@centos ~]$ awk -F',' '$7=="\"IT_PROG\"" {print $1,$3,$7,$8}' emp.csv
[user1@centos ~]$ awk -F, '{if($7=="\"IT_PROG\"") {print $1,$3,$7,$8}}' emp.csv
[user1@centos ~]$ awk -F',' '{if($7~"IT_PROG") {print $1,$3,$7,$8}}' emp.csv
[user1@centos ~]$ cat emp.csv | awk -F ',' '{if($7~"IT_PROG") {print $1,$3,$7,$8}}'
[user1@centos ~]$ awk -F, '{print $1,$3,$7,$8}' emp.csv | grep -i 'it_prog'
[user1@centos ~]$ awk -F, '/IT_PROG/{print $1,$3,$7,$8}' emp.csv
103 "Hunold" "IT_PROG" 9000
104 "Ernst" "IT_PROG" 6000
105 "Austin" "IT_PROG" 4800
106 "Pataballa" "IT_PROG" 4800
107 "Lorentz" "IT_PROG" 4200


[user1@centos ~]$ awk -F, '$8>=15000 {print $1,$3,$7,$8}' emp.csv
100 "King" "AD_PRES" 24000
101 "Kochhar" "AD_VP" 17000
102 "De Haan" "AD_VP" 17000


[user1@centos ~]$ awk -F, '$8==10000 {print $1,$3,$7,$8}' emp.csv
150 "Tucker" "SA_REP" 10000
156 "King" "SA_REP" 10000
169 "Bloom" "SA_REP" 10000
204 "Baer" "PR_REP" 10000


# salary 합계
[user1@centos ~]$ awk -F, '{print $8}' emp.csv | awk '{sum += $1} END {print sum}'
691416


# 용량 합계
[user1@centos ~]$ ls -l
total 24
drwxr-xr-x. 2 user1 user1    6 Nov 30 17:19 Desktop
drwxr-xr-x. 2 user1 user1    6 Nov 30 17:19 Documents
drwxr-xr-x. 2 user1 user1    6 Nov 30 17:19 Downloads
-rw-rw-r--. 1 user1 user1 9226 Dec  5 11:07 emp.csv
...
[user1@centos ~]$ ls -l | awk '{sum += $5} END {print sum}'
[user1@centos ~]$  ls -l | awk '{print $5}' | awk '{sum += $1} END {print sum}'
10549


[user1@centos ~]$ ls -l | awk '{print "파일 : "$9 " 용량 : " $5}'
파일 :  용량 :
파일 : Desktop 용량 : 6
파일 : Documents 용량 : 6
파일 : Downloads 용량 : 6
파일 : emp.csv 용량 : 9226
파일 : file_size 용량 : 430
파일 : Hello.class 용량 : 414
파일 : Hello.java 용량 : 97
파일 : Music 용량 : 6
파일 : Pictures 용량 : 6
파일 : Public 용량 : 6
파일 : Templates 용량 : 6
파일 : ua1 용량 : 6
파일 : users.txt 용량 : 328
파일 : Videos 용량 : 6
[user1@centos ~]$ ls -l | awk '{print "파일 : "$9 " 용량 : " $5}' > file_size



■ sort
특정한 컬럼을 기준으로 정렬하는 명령어

-k 오름차순(기본값)
-rk 내림차순


# 오름차순
sort -k 2 emp.csv
[user1@centos ~]$ awk -F, '{print $3}' emp.csv | sort
[user1@centos ~]$ awk -F, '{print $3,$7,$8,$11}' emp.csv | sort -k 4


# 내림차순
[user1@centos ~]$ awk -F, '{print $3,$7,$8,$11}' emp.csv | sort -rk 4


[user1@centos ~]$ grep -i 'it_prog' emp.csv|awk -F, '{print$2,$6}'
"Alexander" 2006-01-03
"Bruce" 2007-05-21
"David" 2005-06-25
"Valli" 2006-02-05
"Diana" 2007-02-07


[user1@centos ~]$ grep -i 'it_prog' emp.csv|awk -F, '{print$2,$6}'|sort -k 2
"David" 2005-06-25
"Alexander" 2006-01-03
"Valli" 2006-02-05
"Diana" 2007-02-07
"Bruce" 2007-05-21



■ uniq
중복된 라인을 제거하는 명령어

[user1@centos ~]$ awk -F, '{print $7}' emp.csv|uniq|sort
"AC_ACCOUNT"
"AC_MGR"
"AD_ASST"
"AD_PRES"
"AD_VP"
"FI_ACCOUNT"
"FI_MGR"
"HR_REP"
"IT_PROG"
"JOB_ID"
"MK_MAN"
"MK_REP"
"PR_REP"
"PU_CLERK"
"PU_MAN"
"SA_MAN"
"SA_REP"
"SH_CLERK"
"ST_CLERK"
"ST_MAN"



■ echo
출력하고자하는 문장을 출력하는 명령어

-n 다음행과 연결하여 출력하기
-e \n, \t 등 기능 활성화 


[user1@centos ~]$ echo "오늘 하루도 수고하세요"
오늘 하루도 수고하세요

[user1@centos ~]$ vi job.sh [user1@centos ~]$ sh job.sh
********************
직업을 입력해주세요 : ad_vp
********************
101 "Kochhar" "AD_VP"
102 "De Haan" "AD_VP"
#!/bin/bash

echo "********************"
echo -n "직업을 입력해주세요 : "
read job_name
echo "********************"

grep -i $job_name emp.csv | awk -F, '{print$1,$3,$7}'

>>> grep 명령어는 모든 영역에서 찾는거라 특정 열 찾기에는 부적합하다.

[user1@centos ~]$ vi deptno.sh  
#!/bin/bash

echo "********************"
echo -n "부서번호를 입력해주세요 : "
read dept_no
echo "********************"

awk -F, -v dno=$dept_no '$11== dno {print $1,$3,$7,$11}' emp.csv
[user1@centos ~]$ . deptno.sh
********************
부서번호를 입력해주세요 : 90
********************
100 "King" "AD_PRES" 90
101 "Kochhar" "AD_VP" 90
102 "De Haan" "AD_VP" 90


# : 주석
#! : shebang. 셔뱅. #! 다음에 오는 문구를 실행한다.


# shell 호출
[user1@centos ~]$ . job.sh
[user1@centos ~]$ sh job.sh
[user1@centos ~]$ . ./job.sh

[user1@centos ~]$ ./job.sh        ---> 권한체크 후 사용
-bash: ./job.sh: Permission denied
[user1@centos ~]$ ls -l *.sh
-rw-rw-r--. 1 user1 user1 251 Dec  5 14:55 deptno.sh
-rw-rw-r--. 1 user1 user1 166 Dec  5 14:23 job.sh
[user1@centos ~]$ chmod u+x *.sh
[user1@centos ~]$ ls -l *.sh
-rwxrw-r--. 1 user1 user1 251 Dec  5 14:55 deptno.sh
-rwxrw-r--. 1 user1 user1 166 Dec  5 14:23 job.sh





■ 셸 스크립트
# 셸, 쉘(shell) 이란?
운영체제에서 제공하는 명령을 실행하는 프로그램이다.

# 셸 스크립트 란?
인터프리터 역할을 하는것으로 시스템에서 지원하는 명령어들의 집합을 묶어서 프로그램화한 것을 의미한다.

인터프리터 언어는 한줄씩 수행하는 언어

# 셸의 종류
- Bourne shell
- C shell
- Korn shell
- bash shell

# 셸 스크립트 프로그래밍?
- C언어와 유사하게 프로그래밍을 가능하게 한다.
- 변수, 반복문, 조건제어문이 사용가능
- 별도로 컴파일하지 않고 텍스트파일 형태로 바로 실행이 가능하다.
- vi 작성
- 리눅스의 많은 부분이 셸스크립트로 작성되어 있다.

[user1@centos ~]$ hostname
centos

[user1@centos ~]$ echo $HOSTNAME
centos

[user1@centos ~]$ vi user_host.sh
echo "호스트 이름 : "$HOSTNAME
:wq
[user1@centos ~]$ sh user_host.sh
호스트 이름 : centos



■ 변수
- 모든 변수는 문자열로 취급한다.
- 변수이름은 대소문자 구분한다.
- 변수에 값을 대입할 때는 = 좌우에 공백이 없어야 한다.
- 변수에 값을 출력하려면 echo 명령어를 이용하면된다.
    단, 변수를 사용할 때는 변수 앞에 $가 있어야 한다.

[user1@centos ~]$ v_str="오늘 하루도 고생하셨습니다."
[user1@centos ~]$ echo $v_str
오늘 하루도 고생하셨습니다.


# 값을 계산하는 명령어
[user1@centos ~]$ v_num1=100
[user1@centos ~]$ v_num2=200
[user1@centos ~]$ echo $v_num1
100
[user1@centos ~]$ echo $v_num2
200
[user1@centos ~]$ echo $v_num1 + $v_num2
100 + 200
[user1@centos ~]$ expr $v_num1 + $v_num2
300
[user1@centos ~]$ expr $v_num1 - $v_num2
-100
[user1@centos ~]$ expr $v_num1 \* $v_num2
20000
[user1@centos ~]$ expr $v_num1\*$v_num2
100*200
[user1@centos ~]$ expr $v_num1 + 1000 \* $v_num2
200100


# 주의!! 괄호 앞과 뒤의 *앞에 꼭 \ 입력해야 한다.
# 괄호 안에 공백문자 하나를 입력해야 한다.

[user1@centos ~]$ expr \( $v_num1 + 100 \) \* $v_num2
40000



[user1@centos ~]$ num1=100
[user1@centos ~]$ num2=200
[user1@centos ~]$ expr $num1 + $num2
300

[user1@centos ~]$ num3='expr $num1 + $num2'        # 문자열로 저장
[user1@centos ~]$ echo $num3
expr $num1 + $num2

[user1@centos ~]$ num4=`expr $num1 + $num2`        # 계산 수행
[user1@centos ~]$ echo $num4
300

` : backtick,  backquote, grave accent, 억음부호
    `백틱` ≠ '따옴표'


[user1@centos ~]$ x=10
[user1@centos ~]$ y=3
[user1@centos ~]$ echo $x
10
[user1@centos ~]$ echo $y
3
[user1@centos ~]$ expr $x + $y
13
[user1@centos ~]$ echo $((x+y))
13
[user1@centos ~]$ echo $((x/y))
3
[user1@centos ~]$ echo $((x*y))
30
[user1@centos ~]$ echo $((x%y))
1


[문제] 이름을 입력해주세요
[user1@centos ~]$ ename='King'
[user1@centos ~]$ awk -F, -v ename=$ename '{if($3~ename) {print $1,$3}}' emp.csv
100 "King"
156 "King"
[user1@centos ~]$ vi e_name.sh
#!/bin/bash
echo -n "이름을 입력해주세요 : "
read ename
awk -F, -v ename=$ename '{if($3~ename) {print $1,$3} else(}' emp.csv
:wq

[user1@centos ~]$ . e_name.sh
이름을 입력해주세요 : King
100 "King"
156 "King"

 

[문제] 부서코드를 입력하여 급여합계 출력

[user1@centos ~]$ vi sal.sh
#!/bin/bash

echo " "
echo -n "부서번호를 입력해주세요 : "
read dept_no
echo " "

echo "emp_no  name            salary"
echo "-----------  ---------------   --------"
awk -F, -v dept_no=$dept_no '$11==dept_no {printf "%-7s %-15s %d \n", $1,$3,$8}' emp.csv
echo "--------------------------------------"
awk -F, -v dept_no=$dept_no '$11==dept_no {sum+=$8} END {print dept_no " 부서 사원들의 급여 총액은 " sum " 입니다." }' emp.csv

:wq
#!/bin/bash

echo "******************************"
echo -n "부서번호를 입력해주세요 : "
read dept_no
echo "******************************"

list=`awk -F, -v dept_no=$dept_no '$11==dept_no {print $1 "\t" $3 "\t" $8}' emp.csv`
echo "$list"

total=`awk -F, -v dept_no=$dept_no '$11==dept_no {sum+=$8} END {print sum}' emp.csv`
echo "$dept_no 부서 사원들의 급여 총액은 $total 입니다."

:wq
[user1@centos ~]$ . sal.sh

******************************
부서번호를 입력해주세요 : 30
******************************
114 "Raphaely" 11000 30
115 "Khoo" 3100 30
116 "Baida" 2900 30
117 "Tobias" 2800 30
118 "Himuro" 2600 30
119 "Colmenares" 2500 30
30 부서 사원들의 급여 총액은 24900 입니다.

 




java -version, 환경변수 설정

cut
awk
연산
sort
uniq
echo
#
#!
shell
variable
expr