본문 바로가기

UNIX/shell script

shell script 명령어 [스크랩]


출처 : 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