쉘 명령어 모음 ^0^

안녕하세요. 다밍입니다.

오늘은 쉘 명령어 모음에 대해서 소개해 드릴께요.

쉘로 간단한 명령어만 쓰시지 말구요.

엄청난 기능들이 있으니 잘 활용해 보시기 바랍니다.

자 그러면 쉘 명령어 모음에 대해 소개해 드리겠습니다.

쉘 명령어 모음

■ 쉘 명령어 모음

표준출력 저장

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 

 

여기까지 쉘 명령어 모음 이었습니다.

 

쉘 나무위키 정보

쉘 – 나무위키 (namu.wiki)