SED : 텍스트 입력 스트림을 받아 출력을 제어할 수 있는 명령 장점 한줄 만큼의 메모리를 사용하여 메모리가 적게 들어 빠르게 처리 가능 단점 라인단위로 처리되어 지나간 라인에 대해 처리가 불가능하다. sed 옵션 문자열처리_스크립트 파일명 - 옵션 - e : 입력을 처리하는 하나의 처리 명령을 의미 , 여러번 지정하여 여러번의 처리가 가능 - f file : 사전에 명령을 추가한 파일을 지정하여 명령을 수행 - n : 각 명령의 결과를 화면에 출력하지 않고 print 명령을 대기 - r : 확장된 정규표현식을 사용 - 문자열처리 명령어
echo "이것은 테스트입니다." | sed 's/테스트/test/'
s/소스패턴/결과패턴 [root@localhost ~]# cat data.txt 1. it is test 2. it is test 3. it is test 4. it is test 5. it is test 6. it is test 7. it is test
[root@localhost ~]# sed 's/test/sed test/' data.txt 1. it is sed test 2. it is sed test 3. it is sed test 4. it is sed test 5. it is sed test 6. it is sed test 7. it is sed test ->치환하는 명령어를 사용하여 단어가 치환된 상태로 출력
[root@localhost ~]# cat data.txt 1. it is test 2. it is test 3. it is test 4. it is test 5. it is test 6. it is test 7. it is test -> 파일을 읽어서 화면에 출력하는 부분만 관여하기 때문에 원본파일은 그대로 있다.
[테스트라인 - 범위] s/소스패턴/결과패턴 [root@localhost ~]# sed '3,5s/test/sed test/' data.txt 1. it is test 2. it is test 3. it is sed test 4. it is sed test 5. it is sed test 6. it is test 7. it is test -> 3번째 줄에서 5번째 줄까지만 변경됨
[테스트라인 -범위]/d [root@localhost ~]# sed '3,5d' data.txt 1. it is test 2. it is test 6. it is test 7. it is test -> 3번부터 5번까지 삭제
sed 사용할 때는 원본파일에 저장하면 에러가남 -> 출력을 리다이렉트를 사용하여 파일을 쓰거나 sed에 w플래그를 사용하여 쓸수 있다. [root@localhost ~]# sed 's/test/sed tset/w data2.txt' data.txt 1. it is sed tset 2. it is sed tset 3. it is sed tset 4. it is sed tset 5. it is sed tset 6. it is sed tset 7. it is sed tset
or
[root@localhost ~]# cat data2.txt 1. it is sed tset 2. it is sed tset 3. it is sed tset 4. it is sed tset 5. it is sed tset 6. it is sed tset 7. it is sed tset
-e 명령어 사용 [root@localhost ~]# sed -e 's/test/sed test/; s/is/is not/' date.txt <-- ;를 이용해서 구분하여 치환 1. it is not sed test 2. it is not sed test 3. it is not sed test 4. it is not sed test 5. it is not sed test 6. it is not sed test 7. it is not sed test
-n 옵션과 p플래그 [root@localhost ~]# sed -n 's/test/sed test/' date.txt -> n옵션만 사용할 경우 출력 X [root@localhost ~]# sed -n 's/test/sed test/p' date.txt -> p플래그를 붙혀주면 출력O 1. it is sed test 2. it is sed test 3. it is sed test 4. it is sed test 5. it is sed test 6. it is sed test 7. it is sed test
-f 옵션 vi two.sed s/test/sed tset/ s/is/is not/ 위와같은 파일을 만들고 sed -f two.sed data.txt 명령어 입력하면 치환된 상태로 출력됨
[root@localhost] sed -n '/^3/p' date.txt 3. it is test -> 정규표현식 사용하여 출력
AWK : sed기능 + 변수/함수/연산자를 사용하여 필요한 데이터를 제어할 수 있는 프로그램이 가능한 명령 awk 옵션 읽어들일_파일명 -F 필드구분자 : 필드(각각의 항목)를 구분하기 위한 구분자를 지정 -f 파일이름 : awk프로그램이 읽어들일 파일 이름을 지정 -변서 =변수값 : awk프로그램에서 사용할 변수를 지정
awk '{print $1}' txt13 -> 첫번째 필드는 $1 awk '{print $1}' txt13 | grep ccc -> ccc만 출력 awk '/ccc/ {print $1}' txt13 -> grep사용하지 않고 ccc만 출력 grep 111 txt13 | awk '{print S3}' -> grep사용하여 111이 있는 줄을 찾아서 세번째 필드값(zzz)을 출력 awk '/111/ {print $3}' txt13 -> grep사용 하지 않고 111이 있는 줄을 찾아서 세번째 필드값(zzz)을 출력 awk -F: '{print $1}' colon_txt13 -> 구분자 :를 기준으로 출력
[root@localhost ~]# uptime | awk -Faverage: '{print $2}' 0.01, 0.02, 0.00 [root@localhost ~]# uptime | awk -Faverage: '{print $1}' 22:06:53 up 2:40, 0 users, load -> 특수 기호 뿐만 아닌 문자도 구분자가 될 수 있다.
정규표현식 : 텍스트의 패턴을 특수문자 등을 사용하여 표현한 것
ls -1 a* ls -1 | grep ^ a ls -al txt[0-9] <- [ ] 하나당 한 문자 ls -al txt[0-9]^[0-9] (자꾸옵션지정돼서 ^ 써놓음 실제 사용할 때는 빼고쓰기 ) find . -type f -iname "t*" iname : 정규표현식 인식
1. uptime 2. df -h 3. free -m 4. pstree 5. 서버를 입력받아서 그 서버에 ssh로 접속
함수작성 메뉴를 화면에 표시하기 위해서 clear명령어로 화면지움 txt로 메뉴를 출력 <-- menu 함수 메뉴 선택해서 실행 이후에 일시중지 Press any key to continue... <-- press_key while true
#!/bin/bash
function menu { clear cat << EOF ========== menu ========= 1. 로드 에버리지 2. 디스크 상태 3. 메모리 상태 4. 프로새스 트리 5. 입력한 서버에 ssh 접속 6. 메뉴 종료 ======================= EOF read -p "hope : " SELECT } function press_key { echo read -n1 -rsp "Press any key to continue..." echo echo }
while true do menu case ${SELECT} in 1) clear echo "로드 에버리지" uptime press_key ;; 2) clear echo "디스크 상태" df -h press_key ;; 3) clear echo "메모리 상태" free -m press_key ;; 4) clear echo "프로세스 트리" pstree press_key ;; 5) clear read -p "접속하고 싶은 서버 이름을 입력해주세요, (cent[1-3]) : " SVR sleep 1 echo "${SVR}에 접속합니다..." ssh ${SVR} ;; 6) exit 0 ;; * ) echo " wrong num" press_key ;; esac done
↓↓↓↓↓
GUI로 만들기
dialog --옵션명 옵션에필요한변수
#!/bin/bash
function menu { dialog --title " GUI MENU " \ --radiolist "select" 20 35 6 \ <-- 가로사이즈 세로사이즈 메뉴의 개수(숫자) 1. "로드 에버리지" off \ <-- 아무것도 선택하지 않은상태에서 실행하기 위해 off를 써준다. 2. "디스크 상태" off \ 3. "메모리 상태" off \ 4. "프로새스 트리" off \ 5. "입력한 서버에 ssh 접속" off \ 6. "메뉴 종료" off \ 2>./select <-- 표준입력 - 0 , 표준출력 - 1, 표준에러 - 2 }
function press_key { echo read -n1 -rsp "Press any key to continue..." echo echo }
while true do menu SELECT=$(cat select) case ${SELECT} in 1) clear echo "로드 에버리지" uptime press_key ;; 2) clear echo "디스크 상태" df -h press_key ;; 3) clear echo "메모리 상태" free -m press_key ;; 4) clear echo "프로세스 트리" pstree press_key ;; 5) clear read -p "접속하고 싶은 서버 이름을 입력해주세요, (cent[1-3]) : " SVR sleep 1 echo "${SVR}에 접속합니다..." ssh ${SVR} ;; 6) exit 0 ;; * ) echo " wrong num" press_key ;; esac done
read 명령어에 자주사용하는 옵션 p & s read -[ p | s ] "화면에표시할문자" 변수이름
vi read_test.sh (p 옵션 사용- ) #!/bin/bash
read -p "아무문자나 입력 해주세요 : " ANY echo ${ANY}
(s 옵션 사용-> s를 사용할 때는 p 앞에 붙혀야한다. - s는 시크릿 모드로 문자를 입력할 때 화면에 보이지 않고 출력 후에 보인다.) #!/bin/bash
read -sp "아무문자나 입력 해주세요 : " ANY echo ${ANY}
간단 숫자 맞추기 게임 만들기
1. 1~100사이의 숫자를 랜덤으로 생성해서 GOAL에 저장 2. 반복해서 사용자에게 숫자를 입력받음 3. 입력받은 숫자를 GOAL과 비교해서 3-1. 입력받은 숫자가 GOAL보다 크면 숫자가 크다는 메세지를 출력 3-2. 입력받은 숫자가 GOAL보다 작으면 숫자가 작다는 메세지를 출력 3-3. 입력받은 숫자가 GOAL보다 같으면 축하메세지를 출력, 몇 번만에 맞췄는지 알려준다. 4. 3-3을 출력한 후 쉘스크립트를 종료
vi num_game.sh #!/bin/bash
GOAL=$ (($RANDOM% 100+1)) CNT=0 while true
do read -p "1~100숫자를 입력해주세요 : " NUM CNT=$ (($ {CNT} + 1)) if [ ${NUM} -gt ${GOAL} ] then echo " 입력한 숫자가 더 큽니다. " elif [ ${NUM} -lt ${GOAL} ] then echo " 입력한 숫자가 더 작습니다. " elif [ ${NUM} -eq ${GOAL} ] then echo " 축하합니다. ${CNT}번만에 숫자를 맞췄습니다.!! " exit 0 (명령이 성공적으로 완료)(1은 알수없는 오류) fi
배열 배열에 숫자 또는 문자 사용 가능 단, 쉘 스크립트에서는 배열을 자주 사용 안함,, 복잡하게 만들기 때문에 속도는 느리지만 배열대신 file을 사용
test_array=(one two three 4 5 6 7) [root@localhost ~]# echo ${test_array} <- 디폴트로 첫번째 값만 출력됨 one [root@localhost ~]# echo ${test_array[1]} <- 배열번호 지정가능 two [root@localhost ~]# echo ${test_array[ * ]} one two three 4 5 6 7
[root@localhost ~]# for i in $(seq 0 7);do echo $ { test_array [${i}]};done one two three 4 5 6 7
리다이렉션 - 입력 /출력 /에러(표준 스트림)를 지정한 곳으로 바꿔준다. - 쉘 스크립트 안에서 텍스트 파일의 활용 - 표준출력 = 1 표준에러 = 2
WORK안에 있는 txt 파일 리스트 보기 [root@localhost WORK]# ls -al txt? -rw-r--r-- 1 root root 0 Feb 27 21:55 txt1 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt2 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt3
WORK안에 없는 파일이 있으면 없는 파일은 에러메세지 뜸 [root@localhost WORK]# ls -al txt1 txt2 txt3 txt4 ls: cannot access 'txt4': No such file or directory -rw-r--r-- 1 root root 0 Feb 27 21:55 txt1 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt2 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt3
리다이렉트를 이용하여 표준출력(1) & 표준에러(2) 구분하여 해당 파일로 이동 [root@localhost WORK]# ls -al txt1 txt2 txt3 txt4 1> ok 2> ng [root@localhost WORK]# cat ok -rw-r--r-- 1 root root 0 Feb 27 21:55 txt1 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt2 -rw-r--r-- 1 root root 0 Feb 27 21:55 txt3 [root@localhost WORK]# cat ng ls: cannot access 'txt4': No such file or directory
시스템정보를 확인하고 이메일로 보내기 (필요한 결과를 명확하게 하기)
vi res
df -h pstree free -m uptime
vi systeminfo.sh
#!/bin/bash # report 파일 생성 touch report # report파일 초기화 cp -f /dev/null report
### ./nginx_ctl.sh a b c $1 : a , $2 : b , $3 : c -> 유저가 입력한 파라미터 어떻게 인식하는가? -> $,숫자로다가 공백을 기준으로 인식
CMD=$1
case "${CMD}" in
start) NGINX 시작하는 명령 ;; stop) NGINX 멈추는 명령 ;; reload) NGINX 리로드하는 명령 ;; configtest) NGINX 설정파일을 확인하는 명령 ;; * ) echo "사용방법 : ./nginx_ctl.sh {start|stop|reload|configtest}" ;; esac