출처 : http://blog.daum.net/_blog/BlogView.do?blogid=0JlXK&articleno=2804256&categoryId=#ajax_history_home
쉘 책 뒤지기 귀찮을 때.......
## REDIRECTION ##
1.표준출력 저장
- ps > psout.txt
2.표준에러출력
- cc -c src1.c 2> err.txt
3.표준출력과 표준에러의 저장
-kill -1 1234 > killout.txt 2> killerr.txt
-kill -1 1234 > killouterr.txt 2>&1
4.재지향 입력
more < killout.txt
5.예제
- ps -a | sort | uniq | grep -v sh | more
=> ps 명령의 결과를 sorting 하고서(sort) 중복 자료를 제거한후(uniq) 'sh'가 들어간 문자를 제외하고서(grep -v ) 페이지단위로 봄(more)
재지향 2
cat > t.txt << AA
t.txt파일을 만들면서 AA 가 들어올때가지 stdin으로 입력받는다.
즉 입력으로 AA가 입력되면 t.txt 생성되는것이다.
-----------------------------------------------
현재 진행중인 프로세스의 pid 만 찾기
-----------------------------------------------
ps -ef | grep process | grep -v grep | awk '{print $2}' ( 2번째 컬럼만 취한다)
s -ef | grep susm022 | grep -v grep | awk '{print $2}'
-----------------------------------------------
현재 진행중인 프로세스의 pid 만 찾아 kill 하기
-----------------------------------------------
ls -ltr inar2*.pc | awk '{print $9}' | sort -k 1 xargs | so
[prompt ] ps -ef | grep pcs_sync | awk '{print $2}' | xargs kill #현재 진행중인 pcs_sync의 pid 만 찾아 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"
---------------------------------------------------
특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
[prompt] ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \1\.\_\2/g"
현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다. 더 간단하게
[prompt] ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \1\.\2 \1\.\_\2/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가 있는지 찾기
[prompt] whereis bin_name # bin_name 이 있으면 이름만 보여줌
[prompt] which bin_name # bin_name 이 있으면 경로도 보여줌
[prompt] whereis bin_name # bin_name 이 있으면 이름만 보여줌
---------------------------------------------------
무지큰 로그보기
vi 로그파일명. 실행시 로그파일이 수백메가씩이라면 무지느림 그럴땐 less를 사용
[prompt] less to_day001.log
그상태에서 vi 쓰듯이 문자열 검색하면 됨
---------------------------------------------------
system 상태관련
[promt] uname -a #유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
[prompt] netstat -an | grep LISTEN #열려있는 포트 알아내기
[prompt] netstat -rn # 라우팅설정된 상태확인
[prompt] netstat -rn | grep 210.11.12.13(포트번호 9000) #210.11.12.13 ip(포트9000)가 사용되는지 확인
[promt] w #사용자가 어디에서 무엇을 하는지 알아내기
[promt] finger #사용자와 사용자 ip 보기,보안땜에 보통 막아놈
[prompt]who #현재 시스템에 접속한 사용자 계정과 tty 번호 로긴시간 ,ip정보
[prompt] who am i # 자신계정에 대한 정보를 보여줌,
[prompt] whoami #자신의 계정만 보여줌
---------------------------------------------------
[prompt] mkdir -p a/b/c # 하위 디렉토리 한꺼번에 만들기
[promtpt] mv dirnam1 dirname2 # 디렉토리명 바꾸기
---------------------------------------------------
날짜보기
[promtpt] date # 2008년 3월 14일 금요일 오전 11시 45분 17초
[promtpt] date +%y%m%d # 080314
[promtpt] date +%Y%m%d # 20080314
---------------------------------------------------
환경파일설정 수정후 바로적용하기
:환경파일을 수정하면 로그아웃후 다시 로긴해야 적용되나 바로 적용할 수 있다.
csh,tcsh : .cshrc
tch.bsh : .profile
[prompt] source .cshrc(.profile)
[prompt] . .cshrc(.profile)
#############################################
▣내가 돌린 백그라운드 프로세스 죽이기
a.백그라운드로 작업돌리기
[mktmst1@mss1:/data4/mktmst/bin] tail.sh &
b. jobs 명령어로 확인
[mktmst1@mss1:/data4/mktmst/bin]jobs
[2] + Running tail.sh > t &
[1] - Running tail.sh > t &
c.죽이기( kill)
[mktmst1@mss1:/data4/mktmst/bin]kill %1
[mktmst1@mss1:/data4/mktmst/bin]kill %2
d. 확인
[mktmst1@mss1:/data4/mktmst/bin]jobs
[2] + Terminated tail.sh > t &
e. 포 그라운드로 전환하기
[mktmst1@mss1:/data4/mktmst/bin]fg %1 -> 1번 작업을 포그라운드로 전환한다.
f.nohup으로 작업돌리기
-일반적으로 터미널 화면을 종료하면 그 수행하던 작업은 종료된다.특정시간이나 긴 작업처리시 터미널이 종료되도 작업을 진행시킬 수 있다
[prompt:] 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
결과
2d1 => hello1의 두 번째 줄에서 한 줄을 삭제(delete)하는 변화가 일어났다는 의미이다
< #include
6c5,7 => 6c5,7은 hello1의 6번째 줄을 아랫부분으로 바꾸는데(change) 그 결과가 5번째부터 7번째 라인까지 들어가게 된다는 의미이다
> printf("hello, the world of Linux.\n");
>
> printf("Testing one two three.\n");
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