배시 셸 스크립트
목표
■프로그램에 대한 이해력
■프로그램에 대한 문법
프로그램의 syntax. 문법의 대한 에러를 줄인다.
초보자 프로그래밍의 70~80%에러는 형식을 몰라서 오는 syntax error이다.
프로그래밍의 생활화.
불편한 점을 편하게 하기위해 생각
■스크립트 방식 언어(bash shell script -> ruby -> C -> Network Programing)
bash shell script로 언어의 시작으로 실생활에 사용
ruby - 웹 컴퍼넌트 유리
비슷한 언어 perl/python(시스템적인 성격이 강함)
C언어 - 프로그램화 하기 어렵다.
Network Programing
■쉘 스크립트 작성시 선수지식
명령어(grep, sed, awk) + sort, uniq, head, tail, cut
[!] C언어는 함수를 사용하는 것, 쉘 스크립트는 CMD를 사용함
쉘의 특성(redirection, pipe, shell, function, variable, metacharacter, alias, ...)
■ 배시(bash)쉘 기능
① Command-Line Interpreter - 쉘은 명령어 해석기의 역할을 가진다.
② Programming Language - 쉘의 특징을 이용하여 프로그램을 작성할 수 있다.
■ 사용하고 있는 쉘 확인(sh, csh, ksh, bash)
(현재쉘 확인 )# ps
(로그인셀 확인)# grep root /etc/passwd (# echo $SHELL)
(현재쉘 변경 )# sh
(로그인쉘 변경)# usermod -s /bin/sh root (chsh CMD)
# ps
# sh
# ps
# pstree PID
# exit
# ps
■ 쉘에서 실행되는 종류
1.쉘 내부 명령어(EX: if, while, ...)
2.엘리어스(EX: alias ls=’ls –al’)
3.함수(EX: a () { CMD ; CMD; CMD }
4.디스크 내에 존재하는 명령어(EX: /bin/ls)
명령어 실행되는 우선순위 1~4
디스크 내에 ls 명령어가 존재하여도 alias='ls' 되어있으면 우선 동작한다.
■ 쉘 스크립트 작성시 필요한 명령어
쉘 스크립트 작성시 필요한 필수 명령어
grep CMD
sed CMD
awk CMD
--------------------------------------------------------------------------------
유닉스 명령어 - 꼭 알아야할 3가지 명령어
(grep, sed, awk)
----------------------------------------------------------------------------------
grep 명령어
# grep OPTIONS PATTERN file1
OPTIONS: -i, -l, -n, -v, -w, --color
PATTERN: * . ^root root$ [abc] [a-c] [^a]
# CMD | grep xinetd
# cat /etc/passwd | grep root
# ps -ef | grep httpd
# netstat -an | grep :22
# rpm -qa | grep vsftpd
# chkconfig --list | grep sshd
OPTIONS
# grep -i nFS /etc/passwd /* -i : ignore case */
# grep -v root /etc/passwd /* -v : inVerse */
# ps -ef | grep bash | grep -v grep
# grep -n root /etc/group /* -n : number line */
# grep -l root /etc/hosts /etc/passwd /etc/shadow /* -l : list file */
# find /etc -type f -exec grep -l 'eth0' {} \;
# alias grep='grep --color'
PATTERNS
# alias grep='grep --color'
# grep '^root' /etc/group
# ls -l | grep '^-' 라인의 처음이 - (파일의 형식이 일반파일 인것)
# ls -l | grep '^d' 라인의처음이 D (파일의 형식이 디렉토리 파일 인것)
# grep 'root$' /etc/group /etc/grop 에서 root로 끝나는 경우만
# grep '/bin/bash$' /etc/passwd /etc/passwd 에서 /bin/ 밑에 bash로 끝나는 경우만
# grep 'no...y' /etc/passwd no로 시작하여 y로 끝나는 모든 것 (nobody..)
[참고] grep 명령어의 pattern 부분에 변수로 지정하는 경우
# cat grep.sh
--------------------------------
......
PATTERN=root
grep "$PATTERN" /etc/passwd
......
--------------------------------
""(더블쿼트)로 묶어주면 $PATTERN 이 인식되지 않고 문자 그대로 출력
[참고] grep -l 옵션에 대한 예제
WAS(Web Application Server)
httpd, /etc/httpd/conf/httpd.conf, /was/*, /etc/init.d/httpd start
# /etc/init.d/httpd start
.... Server Error .....
# find /was -type f -exec grep -l "Server Error" {} \;
/was/bin/server.xml
# vi /was/bin/server.xml
/Server Error
if 조건 ; then
else
echo ".... Server Error ...."
fi
[참고] grep -l 옵션을 사용하는 다른 예
리눅스 시스템의 부팅 과정
.... Server Error .....
# cd /etc/rc5.d ; find . -type f -exec grep -l "Server Error" {} \;
/etc/rc5.d/S50network.sh
# vi /etc/rc5.d/S50network.sh
/Server Error
sed 명령어
# sed [–n] 'addressCMD' file1
# sed [-n] '/pattern/CMD' file1
-n : not default
■ CMD 사용하는 방법(p CMD)
# sed -n '1,3p' /etc/passwd
# sed -n '/root/p' /etc/passwd (# grep root /etc/passwd)
# sed -n '1,/adm/p' /etc/passwd
# sed -n '10,$p' /etc/passwd
# sed -n '3p' /etc/passwd
■ CMD 사용하는 방법(d CMD) --delete
# sed '1,3d' /etc/hosts /etc/hosts파일에서 1번 줄부터 3줄까지 삭제 후 출력
# sed '3d' /etc/passwd
# sed '3,$d' /etc/passwd 3 부터 마지막줄까지 삭제
# sed '$d' /etc/passwd 마지막줄 삭제
# sed '/root/d' /etc/passwd (# grep -v root /etc/passwd) root라고 검색된 것만 삭제,나머지는 출력
■ CMD 사용하는 방법(s CMD) 치환 (원본파일은 변경되지 않는다. 출력내용만 수정)
# sed 's/root/ROOT/' /etc/group (# sed '1,$s/root/ROOT/' /etc/group)
# sed '1,3s/root/ROOT/g' /etc/group
# sed 's/^....//' filename
# sed 's/....$//' filename
# sed '1,3s/^/ /' /etc/hosts
# sed '1,3s/^ //' /etc/hosts
# sed 's#/test/file.sh#/test/file.c#g' file1
# sed 's;/test/file.sh;/test/file.c;g' file1
# sed 's/root/ROOT/' /etc/group > /tmp/.file1
# mv /tmp/.file1 /etc/group
# sed -i 's/root/ROOT/' /etc/group 수정된 결과를 원본파일에 저장
# sed '/linux200/s/192.168.20.200/172.16.20.200/' /etc/hosts > /tmp/.file1
# mv /tmp/.file1 /etc/hosts
[참고] sed 명령어의 pattern 부분에 변수로 지정하는 경우
# cat sed.sh
------------------------------------
......
PATTERN=root
sed "/^$PATTERN/d" /etc/passwd
......
------------------------------------
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
---------------------------------------------
IP=172.16.10.249
NETMASK=255.255.0.0
.....
---------------------------------------------
# vi ip.sh
--------------------------------------------
........
. /etc/sysconfig/network-scripts/ifcfg-eth0
ifconfig eth0 $IP netmask $NETMASK up
........
--------------------------------------------
awk 명령어
# awk 'statement' file1
# awk '{Action}' file1
# awk 'statement {Action}' file1
# ls -l
-rw-r--r-- 1 root other 0 11월 10 06:29 file1
<-----$1----> <-$2-> <-$3-> <--$4--> <-$5-> <-$6-> ..... <------------------------------------$0-----------------------------------> |
root[/test]#touch file1 file2 file3 |
# awk '{ print $0 }' testfile
# awk '{ print $3 $5 $9 }' testfile
# awk '{ print $3 " " $9 " " $6, $7 }' testfile
# awk '{ print $3 "\t" $5 "\t" $9 }' testfile
# awk '{ print $9, "is using", $5, "bytes" }' testfile
# awk '/file/' testfile testfile 출력 결과중 file이 들어간 것만 출력
# awk '{ print $1, $2, $3 }' testfile
# awk '/file/ { print $1, $2 }' testfile file이 들어간 목록에서 첫번째,두번째 필드만 출력
# awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd
/etc/passwd 에서 3번째 필드가 499보다 크다 그리고 60000보다 작다. 그 출력결과에서 첫번째 필드만 출력
# df -h / | tail -1 | awk '{print $6}'
# ifconfig eth0 | grep inet | grep -v inet6 | \
awk '{print $2}' | awk -F: '{print $2}'
# ps -elf | awk '$2 == "Z" {print $0}'
ps -elf 에서 2번째 필드인 S에서 Z인 상태, 그 라인 전체 출력
[정리]
grep -전체에서 일부만 출력하여 볼때
sed - 출력 내용을 편집작업을 수행 할 때
awk -출력 폼의 순서를 변경해서 출력, 특정한 필드만 출력하여 볼때
기타 명령어
# df –k
# du –sk /var /* -s : sum, -k : KBytes */
# cd /var
# du –sk * | sort –nr | more
sort -nr 출력의 결과를 용량의 크기별 순서대로
# sort –u file1 -u 유일한, 중복되는 것을 하나로만 표시하여 출력
# sort file1 | uniq –d uniq -d (duplecated) / 정렬된 file1 에서 중복되는것만 출력
# sort file1 | uniq -u uniq -u (unduplicated) / 정렬된 file1 에서 중복되지 않는 것만.
uniq 명령어는 sort 명령어가 앞에 있을때만 사용가능
많은 내용을 비교해 볼때 사용가능, 두 내용을 합친 뒤 중복이 되지 않는 것을 출력(uniq -u)
# cat linux200 (# rpm -qa > linux200)
A
B
# cat linux201 (# rpm -qa > linux201)
A
B
C
# cat linux200 linux201 > sum.txt
# sort sum.txt | uniq -u
(사전 파일) dictionary1.txt dictionary2.txt
# cat dictionary1.txt dictionary2.txt | sort -u > sum.txt
# df -k
# du -sk /var
# cd /var; du -sk * | sort -nr | more
cut 명령어
특정한 내용들만 뽑아내어 보고 싶을 때
# ifconfig eth0 | grep 'inet addr:' | awk '{print $2}' | \
cut -d":" -f2 -d 구분자를 :(콜론) 으로 구분해서 2번째 필드
uniq 명령어
sort CMD + uniq CMD
# sort file1 | uniq -d
# sort file1 | uniq -u
tr 명령어
~단어를 ~단어로 변환하는 동작 (인코딩작업)
# cat temp | tr "[A-Z]" "[a-z]" 대문자를 소문자로 치환
# cat temp | tr "[a-z]" "[A-Z]" 소문자는 대문자로 치환
split 명령어
쪼갤때 사용
# cat /etc/hosts (여러개 라인으로 구성)
# cd /test ; rm -rf /test/*
# split -l 3 /etc/hosts && ls
xaa xab xac xad xae xaf
# cat xaa ; cat xab ; cat xac
용량이 큰 것을 올리기 힘들때 작은양으로 분할할 때.
xaa xab xac..를 다른것으로 대신할 때
PREFIXaa, PREFIXab, ...
# split -d -l 3 /etc/hosts
x00 x01 x02 x03 x04
반복구문으로 쉽게 다룰때 유용
-d :decimal number
-l :line
붙이는 역활
# paste file1 file2 두개의 파일을 합치는 역할
# cat > file1
1111
2222
3333
# cat > file2
aaaa
bbbb
cccc
# paste file1 file2
1111 aaaa
2222 bbbb
3333 cccc
# head /etc/passwd (# head -10 /etc/passwd)
(# head -n 10 /etc/passwd)
# head -5 /etc/passwd (# head -n 5 /etc/passwd)
tail 명령어
# tail /etc/passwd (# tail -10 /etc/passwd)
(# tail -n 10 /etc/passwd)
# tail -5 /etc/passwd
# tail +5 /etc/passwd
# tail -f /var/log/messages
# tail -0f /var/log/messages
# tail -f /var/log/messages /var/log/secure
# alias pps='ps -ef | head -1 ; ps -ef | grep $1'
# pps xinetd
# pps java
wc 명령어
카운트로 출력
# wc /etc/passwd
# wc -l /etc/passwd
# wc -w /etc/passwd
# wc -c /etc/passwd
[참고] Data Gathering(데이터 수집)
# ps -ef | grep httpd | wc -l 웹 데몬에 현재 서버에 몇명이나 붙어 있나 확인해 보기 위함
# cat /var/log/secure | grep 'Accepted password for' | grep sshd | grep 'Mar 16' | wc -l
3월 16일에 ssh에 접속한 기록만 라인카운트로 출력
'Learning > └◆Shell Scripts' 카테고리의 다른 글
셸 스크립트 작성[초급편] (0) | 2016.12.14 |
---|---|
쉘 스크립트 코드 분석 (0) | 2016.12.14 |
[Shell Scripting] 본(Born) 쉘 프로그래밍_4 (0) | 2016.12.12 |
[Shell Scripting] 본(Born) 쉘 프로그래밍_3 (0) | 2016.12.12 |