안녕하세요. 다밍입니다.
오늘은 쉘 명령어 모음에 대해서 소개해 드릴께요.
쉘로 간단한 명령어만 쓰시지 말구요.
엄청난 기능들이 있으니 잘 활용해 보시기 바랍니다.
자 그러면 쉘 명령어 모음에 대해 소개해 드리겠습니다.
■ 쉘 명령어 모음
표준출력 저장
ps > psout.txt
표준에러출력
cc -c src1.c 2> err.txt
표준출력과 표준에러의 저장
kill -1 1234 > killout.txt 2> killerr.txt kill -1 1234 > killouterr.txt 2>&1
재지향 입력
more < killout.txt
ps 명령의 결과를 sorting 후 중복 자료 제거(uniq) ‘sh’가 들어간 문자를 제외하고(grep -v ) 페이지 단위로 보여줌(more)
ps -a | sort | uniq | grep -v sh | more
현재 진행중인 프로세스의 pid 만 찾기
ps -ef | grep process | grep -v grep | awk '{print $2}'
현재 진행중인 pcs_sync의 pid 만 찾아 kill 하기
ps -ef | grep pcs_sync | awk '{print $2}' | xargs kill
파일 찾아서 문자열 찾기
find ./ -name "inar*.pc" -print | xargs grep "aaaa" find . -name "파일명" | awk '{print $1}' find / -name '*.*' -exec grep 'EXEC' {} \; find / -name '*.pc' -exec grep 'EXEC' {} \;
찾은 파일에서 문자열 찾기
find ./ -name "*.pc" | grep "aaa"
특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \.\_/g"
현재 디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾸기
ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \. \.\_/g"
*.eml 라는 파일을 다 지우고 싶을 때.
rm -rf `find . -name "*.eml" ` find / -name "*.eml" -exec rm -f {} \;
디렉토리 크기 보기
du #disk used du -k #kilobyte단위로 보기 du -k | sort -n # 디렉토리크기를 정렬해서 보기 du -k | sort -rn #크키를 반대로 정렬해서 보기
가장 큰 파일 찾기
ls -lR | sort +4n # 파일록록 결과중 4포지션 뒤부터 정렬 ls -lR | sort -k 5 # 파일록록 결과중 5를 키로 해서 정렬 ls -al | grep "^d" #디렉토리만 빠르게 검색(정규식을 이용한거임)
실행할 binary가 있는지 찾기
whereis bin_name # bin_name 이 있으면 이름만 보여줌 which bin_name # bin_name 이 있으면 경로도 보여줌 whereis bin_name # bin_name 이 있으면 이름만 보여줌
큰 로그보기(수백메가일 경우)
less txtlog.log
system 상태관련(쉘 명령어 모음)
uname -a #유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어 netstat -an | grep LISTEN #열려있는 포트 알아내기 netstat -rn # 라우팅설정된 상태확인 netstat -rn | grep 210.11.12.13(포트번호 9000) #210.11.12.13 ip(포트9000)가 사용되는지 확인 w #사용자가 어디에서 무엇을 하는지 알아내기 finger #사용자와 사용자 ip 보기,보안땜에 보통 막아놈 who #현재 시스템에 접속한 사용자 계정과 tty 번호 로긴시간 ,ip정보 who am i # 자신계정에 대한 정보를 보여줌, whoami #자신의 계정만 보여줌 mkdir -p a/b/c # 하위 디렉토리 한꺼번에 만들기 mv dirnam1 dirname2 # 디렉토리명 바꾸기
날짜보기
date # 2008년 3월 14일 금요일 오전 11시 45분 17초 date +%y%m%d # 080314 date +%Y%m%d # 20080314
환경파일설정 수정후 바로적용하기(환경파일을 수정하면 로그아웃후 다시 로긴해야 적용되나 바로 적용할 수 있다.)
csh,tcsh : .cshrc tch.bsh : .profile source .cshrc(.profile) . .cshrc(.profile)
백그라운드 프로세스
a.백그라운드로 작업돌리기
tail.sh &
b. jobs 명령어로 확인
jobs [2] + Running tail.sh > t & [1] - Running tail.sh > t &
c.죽이기( kill)
kill %1
d. 확인
jobs [2] + Terminated tail.sh > t &
e. 포 그라운드로 전환하기
fg %1 -> 1번 작업을 포그라운드로 전환한다.
f.nohup으로 작업돌리기
-일반적으로 터미널 화면을 종료하면 그 수행하던 작업은 종료된다.특정시간이나 긴 작업처리시 터미널이 종료되도 작업을 진행시킬 수 있다.
nohup tail.sh & # nohup 명령으로 tail.sh 작업을 백그라운드로 실행한다.
오라클 sql 실행하기(쉘 명령어 모음)
#ptcn . /mslb/mktdev2/.profile >/dev/null; #null 파일로 출력을 보낸다.즉 아무것도 출력안한다는 뜻 sqlplus ptcn/ptcn @/mslb/rscy.sql `date +%y%m` # oracle sqlplus로 로긴해서 rscy.sql 를 당일 시스템날짜를 입력받아 실행시킨다.
파일에서 문자열찾기2
grep 'aaa' egrep 'aaa | bbb' -- 여러문자열 차기
diff 사용하기
diff a.txt b.txt diff -u (unified format 형식으로 보기) 변경되는 부분만이 아닌 변경되는 부분 근처의 내용(context)도 같이 출력됨 diff -c (context format 형식 )
디렉토리 내 파일 비교
diff -urN dir1 dir2 (r : 하위디렉토리까지 검색, N : 새로생긴파일도 비교)
patch
p0 : 현 디렉토리에서 patch 작업 p1 : diff한 결과물의 디렉토리를 1 단계 제거하고 사용 patch -p0 < hello.diff patch -p1 < hello.diff
loop
#!/bin/sh #set -x #ENDNUM="0 1 2 3 4 5 6" SNUM=$1 ENUM=$2 #for 쓰기 #for x in $ENDNUM #do # echo "2 + $x \n" #done #while 쓰기 while [ "$SNUM" -lt "$ENUM" ] do echo "num is $SNUM \n" SNUM=`expr $SNUM + 1` done exit 0
디렉토리 내 파일 비교
$ # : 입력 인자 갯수 $@ : 입력문자렬 전체 $* : 입력문자렬 전체 $1,$2... : 실행시 입력받는 인자들 #!/bin/sh set -x #
debugging 모들로 실행하기(쉘 명령어 모음)
echo $# #▣ 입력 인자 갯수 echo $@ #▣ 입력문자렬 전체 echo $* #▣ 입력문자렬 전체 ARG=`echo $1 | sed 's/:/ /g'` #echo "test $ARG" seq="" ARG=`echo $1 | sed 's/:/ /g'` #▣ sed :: 입력인자중 ':' 를 '공백으로' 치환 echo "1 test-------------" seq="" echo "2 test-------------" for code in `echo $ARG` #▣ echo $ARG 한 결과가 code 에 들어감 , 즉 code 변수는 seq=1 값을 가지게 됨 do #tmp=`eval! $code 2>&1 /dev/null` echo "print -1-----var [$code] [$seq]" eval! $code #▣ eval!이 $code 변수를 명령어로 만들어 버림. 결국 code에 들어있는 'seq=1' 로 할당하는 코드가 실행됨 echo "print -2-----var [$code] [$seq]" done echo "test 3----------------" var=$seq echo "test var is $var" if [ "$seq" = "" ] then echo usage :`basename $0` seq=n "[start]" or "[stop]" exit 1 fi shift kkkk.sh sys=2:svc=4:seq=${seq} $@ #▣ seq=${seq} 서브쉘로 실행되서 seq변수에 seq 값을 다시 할당함
test 명령어(쉘 명령어 모음)
test 명령어는 표현식을 평가하고 반환code를 생성하는데 사용한다. test 명령어는 정수와 문자열과 파일의 조건을 검사하는 데에 사용될 수 있으며, 일반적으로 if문과 while문 등의 조건부 흐름 제어에 사용한다. 사용법은, test expression! or [expression!] 표현식이 true이면 0을 return하고 false이면 0이 아닌 값을 return한다. - 수식 평가 수식을 평가하는 데에의 표현식 사용법은, [숫자 관계 숫자] 여기서 관계는, -lt : less than -le : less than or equal to -gt : greater than -ge : greater than or equal to -eq : equal to -ne : not equal to 예를 들어 x를 3이라 가정하면, $ [ $x -lt 7] $ echo $? 0 $ [ $x -gt 7] $ echo $? 1 - 문자열 평가 test 명령에서 문자열을 평가할 때의 표현식은, [문자열1 = 문자열2] : 문자열이 같은 지를 평가함. [문자열1 != 문자열2] : 문자열이 다른 지를 평가함. 예를 들어보자. $ x=abc $ [ $x ="abc"] $ echo $? 0 $ [ $x !="abc"] $ echo $? 1 문자열에는 반드시 ""나''부호를 사용해야 한다. 문자열 연산자에는, -z 문자열 : 문자열의 길이가 0이면 참 -n 문자열 : 문자열의 길이가 0이 아니면 참 - 파일 평가 test 문에서 파일이 디렉토리인지 파일인지를 평가할 수 있다. 사용법은, test -Option filename 여기서 Option은, -f : filename이 파일이면 참. -d : filename이 디렉토리이면 참. -s : 파일이 존재하며 크기가 0보다 크면 참. -r : 파일이 존재하며 읽기 가능하면 참. -w : 파일이 존재하며 쓰기 가능하면 참. -x : 파일이 존재하며 실행 가능하면 참. - 다른 연산자 test 명령어에서 다음의 연산자를 사용하면 복수 검사가 가능하다. -o : or -a : and ! : not \(\) : grouping 예를 들어, $ test -s filename -a -r filename 파일이 존재하고 size가 0보다 크며 그리고(and) 읽기 가능한지를 검사함.
산술식 표현(쉘 명령어 모음)
- 본격적으로 반복문을 시작하기 전에, 쉘 script에서의 산술식 표현 방법을 알아보자. 산술식 표현 방법은, let expression! or ((expression!)) 예를 들어보자. $ x=10 $ y=2 $ ((x=x+2)) $ echo $x 12 쉘 script에서의 산술식은 let 명령을 사용하거나, 괄호를 두 개 사용하여 표현하거나 expr 명령어를 이용한다. 예를 들어보자. $ let x=x+6 $ echo $x 18 $ let "x=x/(y+1)" $ echo $x 6 산술식 표현 속에 괄호는 평가 순서를 바꾸는 데 사용될 수 있다. 이런 경우 큰 따옴표를 써야함을 유의하자. 위의 형식에 대한 바른 표현은, let "x=x/(y+1)"또는 ((x=x/(y+1))) 또는 x=`expr $x/($y+1)` [참고] ` (back qoute) expr 을 사용한 예를 더 살펴보자. $ expr 30 "*" 30 900 ▣ if 문 if 문은 program을 조건에 따라 분기시킨다. - 사용법을 살펴보면, if list a then list b fi 사용예는 다음과 같다. if test -s funfile then echo funfile exists fi -> funfile이 존재하고 크기가 0이 아니면 "funfile exists"라는 message를 화면에 뿌린다.
반복문 (loop문) (쉘 명령어 모음)
반복문은 일련의 명령을 반복할 수 있게 한다. 반복을 계속할 지는 키 명령의 반환 코드에 기초하여 이루어진다. if 문이나 case 문은 key word로 시작되고 거꾸로 된 key word로 끝나는 반면 반복문은 키워드와 어떤 조건으로 시작하고 내부는 do/done으로 둘러 쌓이게 된다. 반복문은 아래의 3가지 형태이다. while 문 while… do done until 문 until… do done for 문 for… do done
while 문(쉘 명령어 모음)
- while 문은 조건이 참인 동안은 loop를 반복한다. 사용법을 살펴보면, while list a do list b done 사용예[1]은 다음과 같다 $cat sample_while x=1 while((x<=10)) do echo x is $x let x=x+1 done $sample_while x is 1 x is 2 ?BR> ?BR> ? x is 10 위의 예에서 알 수 있듯이 조건식인 ((x<=10))이 참인 동안은 loop 내부를 반복하게 된다. 그래서, 무한 loop에 빠지지 않아야 함을 주의하자. 사용예[2]는 다음과 같다 $ cat sample_while2 ans=yes while [ $ans = "yes" ] do echo enter a name read name echo yes or no read ans done $ chmod 777 sample_while2 $ sample_while2
until 문(쉘 명령어 모음)
until 문은 조건식이 참이 될 때까지 loop를 반복한다. (비교 : while 문은 조건이 참인 동안 loop가 계속된다.) 사용법을 살펴보면, until list a do list b done 사용예는 다음과 같다. $ cat sample_until x=1 until((x>10)) do echo x is $x let x=x+1 done $ sample_until x is 1 x is 2 x is 10 위의 예에서 알 수 있듯이 until 문은 조건이 참이 될 때 까지 반복된다.
for 문(쉘 명령어 모음)
for 문은 list에 있는 각 item들이 for 반복문에 순차적으로 할당되어 소진될 때 까지 loop를 실행한다. 사용법을 살펴보면, for var list do list done 사용예는 다음과 같다. $ cat sample_for for x in 1 2 3 4 5 do echo " 2 * $x is \c" let x=x=+2 echo $x done $ sample_for 2*1 is 2 2*2 is 4 ?BR> ?BR> ?BR> 2*5 is 10
break, continue, exit (쉘 명령어 모음)
반복문에서 loop를 중단시킬 필요가 있을 때가 있을 수 있다. break 와 continue 는 무조건적인 흐름 제어를 제공한다. exit :전체 프로그램이 종료되어야 할 경우 사용한다. 프로그램을 완전히 종료하고 쉘 프롬프트로 나가게 한다. break : loop 를 종료하고 done 다음의 명령을 계속하여 수행하도록 한다. continue loop 의 나머지 명령을 중단하고 loop 의 맨 위로 가게 한다. 즉, continue는 단지 한번의 loop를 종료하고 loop의 맨 위에서 loop를 계속하게 하며, break는 loop를 빠져나가 다음 단계를 계속 수행하게 한다. 사용예는 다음과 같다. $ cat sample_break while true do echo "enter file name to remove :\c" read file if test ! -f $file then cho $file is not a require file continue fi echo removing $ file rm $file break done
여기까지 쉘 명령어 모음 이었습니다.