본문 바로가기

Learning/└◆Shell Scripts

배시(bash)쉘 스크립트 작성시 대표적인 명령어

배시 셸 스크립트 

 

 

목표

 

■프로그램에 대한 이해력

프로그램에 대한 문법

프로그램의 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 -l 'root' /etc/hosts /etc/passwd /etc/group


sed
# sed '1,3d' /etc/passwd    /*1~3번을 삭제, 모니터상에 1~3번째줄이 보이지 않는다. */
# sed -n '1,3p' /etc/passwd /* passwd 파일에서 1~3번째 라인 출력 */
# sed 's/^root/ROOT/g' /etc/passwd /* 문서전체에서 라인의 처음 root->ROOT */

awk
awk -F: '$3 > 99 && $3 < 60000 { print $1 }' /etc/passwd (-F : Field Seperate)

----------------------------------------------------------------------------------

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   1110 06:29 file1

 

<-----$1----> <-$2-> <-$3->    <--$4-->    <-$5-> <-$6-> .....

<------------------------------------$0----------------------------------->

 

 

root[/test]#touch file1 file2 file3
root[/test]#mkdir dir1 dir2 dir3
root[/test]#ls
dir1  dir2  dir3  file1  file2  file3
root[/test]#ls -l > testfile
root[/test]#
root[/test]#cat testfile 

 

# 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 -출력 폼의 순서를 변경해서 출력, 특정한 필드만 출력하여 볼때

 

 

기타 명령어

 

sort 명령어

 

# 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 명령어

 

붙이는 역활

# paste file1 file2  두개의 파일을 합치는 역할

 

# cat > file1

1111

2222

3333

# cat > file2

aaaa

bbbb

cccc

# paste file1 file2

1111    aaaa

2222    bbbb

3333    cccc

 

 

head 명령어

 

 

 

# 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에 접속한 기록만 라인카운트로 출력