구글애드-가로긴거2



[UNIX] 쉘 스크립트 『ETC』

실무 예제로 배우는 UNIX 쉘 프로그래밍-정보문화사

http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/index.html


=========================================================================================
#쉘 스크립트
 - 쉘에 의해 실행되는 명령을 포함한 텍스트 파일
 - 쉘 스크립트의 첫 라인은 어느 쉘이 실행하는지 표기한다
  #!/bin/sh

#쉘 구문
 - 단일 따옴표(')
  - 쉘에서 제공하는 가장 제한된 형태의 인용법. 단일 따옴표로 둘러싸인 텍스트는 쉘에 의해 무시된다.
 - 이중 따옴표(")
  - 이중 따옴표로 둘러싸인 텍스트는 쉘에서 인용된 텍스트 내 대부분의 특수 문자를 무시한다.
  - 변수를 참조할 때는 보통 큰 따옴표(" ")로 묶어 주는게 좋습니다
 - 역 따옴표(`)를 이용한 명령 치환  
 
 - 제어 흐름문
  - if 문
   - if 문은 항상 fi 문으로 종료한다.
#특수 문자
 - #
  - 주석
 - `
  - 명령어 치환
  -`명령어`라고 하면 명령어의 결과를 변수값으로 설정할 수 있음.
  -다른말로 backticks나 역쿼우트(backquote)라고도 함.
 - $
  - 변수 치환(변수의 값을 참조하는 것)
 - |
  - 파이프. 여러 명령어들을 연결하는 방법으로써, 한 명령어의 출력을 다음 명령어나 쉘에게 전달.
 - &
  - 작업을 백그라운드로 돌리기. 명령어 뒤에 &를 붙여 주면 백그라운드로 실행됩니다.
 - {}
  - 코드 블럭. [중괄호] "인라인 그룹"이라고도 부르는 중괄호 한 쌍은 실제로 익명의 함수를 만들어 냅니다만
  보통의 함수와는 달리 코드 블럭 안의 변수들을 스크립트의 다른 곳에서 볼 수가 있다.
  - 중괄호로 묶인 코드 블럭은 I/O 재지향되거나 재지향을 받을 수 있다.

#쉘 함수와 내장 명령
 - 쉘 함수
 - 내장 명령
  - export 명령
   - export 명령은 실행될 모든 명령의 환경에 자동적으로 보내지는 명령 라인에 명명된 변수를 표시한다.
   일반적으로, 쉘 변수는 환경에 존재하지 않고, 쉘에서 실행하는 명령에 의해서도 보이지 않는다.
   - 현재 실행중인 스크립트나 쉘의 모든 자식 프로세스가 변수를 사용할 수 있게 해준다.
   - 스크립트나 쉘을 부른 부모 프로세스에게 변수를 다시 export 할 방법은 없음.
   - export 는 시스템 구동(startup) 파일에서 환경 변수를 초기화하고
   그 다음에 생성될 사용자 프로세스들이 그 변수에 접근할 수 있게 해주는 아주 중요한 용도로 쓰인다.

  - exit 명령
   - exit [n]
    - n 값은 쉘의 종료 상태이다.
    - n이 생략되면, 쉘의 종료 상태는 실행된 마지막 명령의 종료 상태이다.
    - 쉘 스크립트가 파일의 끝에 이르게 되면 쉘 스크립트는 종료되고,
    종료 상태는 쉘 스크립트에서 실행된 마지막 명령의 종료 상태가 된다.
  - test 명령
   - test [expression]
     [[expression]]
   - 표현식을 평가하고 이 식이 참인지 거짓인지 지시하기 위한 종료 상태를 결정한다
   - 옵션 리스트
    - 파일 테스트
     -r file : file이 읽기 가능하면 참
     -w file :file이 쓰기 가능하면 참
     -x file : file이 실행가능하면 참
     -f file : file이 일만 파일이면 참
     -d file : file이 디렉토리이면 참
     -s file : file의 길이가 0보다 크면 참
     -t [filedes] : 파일 디스크립터 넘버(default=1)가 터미널과 관련 있으면 참
    - 문자열 테스트
     -z str : str의 길이가 0이면 참
     -n str : str의 길이가 0보다 크면 참
     str : str이 빈 문자열이 아니면 참
     str1 = str2 : str1과 str2가 같다면 참
     str1 != str2 : str1과 str2가 같지 않다면 참
    - 수치 테스트
     int1 -eq int2 : int1이 int2가 같으면 참
     int1 -ne int2 : int1이 int2가 같지 않다면 참
     int1 -lt int2 : int1이 int2보다 작으면 참
     int1 -le int2 : int1이 int2보다 작거나 같으면 참
     int1 -gt int2 : int1이 int2보다 크면 참
     int1 -ge int2 : int1이 int2보다 크거나 같으면 참
     ! : NOT 연산자, ! 뒤의 표현식이 거짓이면 참
     -a : ANT 연산자, -a 앞 뒤의 표현식이 모두 참이면 참
     -o : OR 연산자, -o 앞 뒤의 표현식 중 하나가 참이면 참
     (expr) : 그룹화한 표현식의 괄호
#명령어
 - ps
  - ps 명령을 사용하여 대체로 시스템에서 실행하고 있는 프로세스의 일반적인 정보를 얻을 수 있다.
  - 옵션
   -ef : 모든 프로세스를 본다.
#기본 명령어
 - ls
  - 목록을 보여주는 기본 명령어
  - 옵션
   -R : 디렉토리 구조를 트리같은 형태로 보여줌
   -S : 파일 크기대로 정렬해 준다.
   -t : 변경 시간으로 정렬해 줌
   -i : 파일의 inode를 보여줌
   -lt
 - cat
  - 파일을 표준출력으로 뿌려 줍니다.
  - 보통 재지향(>이나 >>)과 같이 써 여러 파일을 한 파일로 만들어 줍니다.
 - chmod


#복잡한 명령어
 - find
  - bash$ find ~/ -name '*.txt'
 - expr
  - 다목적 표현식 평가 명령어 : 주어진 연산에 따라 자동으로 계산하거나 평가합니다. 이 때, 인자는 빈칸으로 분리되어야 함.
  산술, 비교, 문자열, 논리 연산등이 가능.
  - expr 3 + 5

#시간/날짜 명령어
 - date
  - 간단하게 date라고만 치면 날짜와 시간을 표준 출력으로 보여줍니다.
#텍스트 처리 명령어
 - tail
  - 파일의 마지막 부분을 표준출력으로 보여줍니다.(기본적으로 10줄.)
  - 보통 시스템 로그 파일의 변경 사항을 추적할 때 쓰는데, 파일 뒷부분에 계속 덧붙여지는 사항을 볼 수 있게 해주는 -f 옵션을 주면 됩니다.
 - grep
  - 정규 표현식을 쓰는 다목적 파일 검색 도구
  - grep pattern[file...] 
  - 대상 파일에서 보통 텍스트이거나 정규 표현식인 pattern을 찾아 줍니다.
  - 옵션
   -i : 대소문자 구분 없이 찾음
   -l : 일치하는 줄이 아니라 일치하는 줄이 들어있는 파일만 보여줌
   -n : 일치하는 줄과 그 줄번호를 같이 보여줌.
   -v : 일치하는 패턴을 걸러냄(패턴이 존재하지 않는 행만 출력(invert)
   -c : 일치하는 패턴을 보여주지 않고 일치한 횟수만 보여줌.
   -w : 패턴 표현식을 하나의 단어로 취급하여 검색한다(word)
#통신 명령어
 - ping
  - 지역 네트워크나 외부 네트워크에 있는 다른 머신에게 "ICMP ECHO_REQUEST" 패킷을 브로드캐스트합니다.
  - 네트워크 연결을 테스트 하는데 쓰이는 진단 도구이고, 조심해서 써야 됩니다.
 - ftp
  - 리모트 호스트와 파일을 업로드/다운로드 할 수 있게 해주는 유틸리티 프로토콜입니다.
  - ftp 세션은 스크립트에서 자동화 될 수 있습니다.
  - 옵션
   -n : 자동 로그인을 막아준다.

#Awk
 - awk는 C 문법을 연상시키는 완전한 형태의 텍스트 처리 언어이다.
 - awk는 입력된 각 줄을 필드로 나눈다. 디폴트로, 필드는 공백문자로 분리된 연속된 문자들로 이루어 진다.
 awk는 이렇게 파싱된 필드를 기준으로 동작하게 된다.
 - awk '{print $3}' # 세번째 필드를 표준출력으로 출력
 - awk '{print $1 $5 $6}' # 첫번째, 다섯번째, 여섯번째 필드를 출력

#read 명령
 - read 명령은 각 라인의 입력을 표준 입력에서 읽을 때 자동적으로 파싱한다.
 - 변수값을 표준입력에서 "읽어 들입니다"
 - read로 변수 할당하기
  read var1
  # var1 변수가 read에 의해 세트되기 때문에 var1 앞에 '$'가 없다.

#cut 명령
 - 문자열에서 필드를 추출
 - 문자열은 파이프라인을 통해 cut으로 전달된다.
 - 필드는 문자열을 구분자로 파싱하거나, 문자열 내의 필드 위치를 명시하여 위치를 지정할 수 있다.
 - 예
  $ echo "abc:def:ghi" | cut -d':' -f2
  def
  $
  -d':' 옵션은 cut 명령이 콜론 문자를 구분자로 사용하도록 지시하고, -f2 옵션은 cut 명령이 두번째 필드를 추출한다.

  $ echo "abc:def:ghi" | cut -c5-7
  def
  $
  문자열의 위치를 5~7의 문자 위치로 지정한다  

#Sar(http://tunelinux.pe.kr/wikix/index.php?display=Sar)
sar 이용하여 시스템 모니터링하기
 - sysstat 웹 사이트 (http://perso.wanadoo.fr/sebastien.godard/)
 - sar는 redhat 7.x 에 기본 들어있는 sysstat 패키지에 있는 프로그램이다. sar 프로그램은 시스템의 다양한 활동에 대하여 모니터링을 할 수 있는데 모니터링 대상이 상당히 넓은 편이다. 기본값은 CPU 활동에 대한 통계를 출력한다. sar는 각종 활동에 대한 통계를 다른 프로그램을 이용하여 파일로 저장하고 통계치를 출력할 수 있는 기능을 제공한다.
 - 옵션
  -r 메모리 및 스왑 스페이스 사용현황, -u CPU 활용량, -W 스와핑 상황. -q load average
 - 예
  [jenna@E-220R /home/jenna/BASH]$sar -r 1

  SunOS E-220R 5.8 Generic_117350-33 sun4u    08/19/08

  11:33:13 freemem freeswap
  11:33:14  133156 10515600

  [jenna@E-220R /home/jenna/BASH]$sar 1 1
 

#Sed
 - sed는 비대화형(non-interactive) 모드의 줄 단위 편집기입니다. 표준입력이나 파일에서 텍스트를 입력으로 받아, 주어진 줄들에 대해 한 번에 한 줄씩 어떤 처리를 한 다음 그 결과를 표준출력이나 파일로 내 보냅니다.
 - sed는 쉘 스크립트에서 파이프에 걸어 쓸 수 있는 몇몇 도구중 하나입니다.
 - sed를 필터로 사용하기
  - sed 편집기 디자인은 필터를 작성하는 이상적인 툴이다.
  - 입력을 표준 입력에서 취하고 출력을 표준 출력에 작성하며, 편집 명령을 명령 라인에 입력한다.
  sed가 할 수 있는 일 가운데, 일반적으로 printing(표준출력으로 출력), deletion(삭제), substitution(치환) 을 사용한다.
  - 예
   [jenna@E-220R /home/jenna/BASH]$cat a.txt | grep cpu | awk '{print$3}'
   50%
   [jenna@E-220R /home/jenna/BASH]$cat a.txt | grep cpu | awk '{print$3}' | sed s/%//g
   50
   [jenna@E-220R /home/jenna/BASH]$echo 500% | sed s/%//g
   500
  -기본 sed 연산자
   [주소-범위]/p print [주어진 주소 범위] 출력
   [주소-범위]/d delete [주어진 주소 범위] 삭제
   s/pattern1/pattern2/ substitute 한 줄에서 처음 나타나는 pattern1을 pattern2로 치환
   [주소-범위]/s/pattern1/pattern2/ substitute 주소-범위에 대해서 한 줄에 처음 나타나는 patter1을 pattern2로 치환
   [주소-범위]/y/pattern1/pattern2/ transform 주소-범위에 대해서 pattern1에 나타나는 어떤 문자라도 pattern2에 나타나는 문자로 바꿈(tr과 동일)
   g global 입력의 일치하는 각 줄에서 발생하는 모든 패턴에 대해 동작
  - 예제
   8d 입력의 8번째 줄을 지워라.
   /^$/d 빈 줄을 모두 지워라.
   1,/^$/d 첫 줄부터 처음 나타나는 빈 줄까지 지워라.
   /Jones/p "Jones"를 포함하는 줄만 출력하라(-n 옵션을 써서).
   s/Windows/Linux/ 입력의 각 줄에서 처음 나오는 "Windows"를 "Linux"로 치환하라.
   s/BSOD/stability/g 입력의 각 줄에서 "BSOD"가 나올 때 마다 "stability"로 치환하라.
   s/ *$// 모든 줄의 끝에 나오는 빈 칸을 지워라.
   s/00*/0/g 연속적인 모든 0을 하나의 0으로 압축하라.
   /GUI/d "GUI"를 포함하는 모든 줄을 지워라.
   s/GUI//g "GUI"가 나오는 줄에서 "GUI"만 지워라.

# I/O 재지향
 - 쉘은 항상 기본적으로 표준입력(stdin, 키보드), 표준출력(stdout, 스크린), 표준에러(stderr, 스크린에 뿌려질 에러 메세지)
 "파일들"을 열어 놓습니다. 이 파일들을 포함해서 열려 있는 어떤 파일이라도 재지향 될 수 있습니다.
 - 재지향이란 간단히 말해서 파일, 명령어, 프로그램, 스크립트, 심지어는 스크립트 속의 코드블럭의 출력을 낚아 채서
 다른 파일, 명령어, 프로그램, 스크립트의 입력으로 보내는 것
 >
       # 표준출력을 파일로 재지향.
       # 파일이 없으면 새로 만들고, 있다면 덮어 씁니다.

       ls -lR > dir-tree.list
       # 디렉토리 트리 목록을 파일로 저장해 줍니다.
 >>
       # 표준출력을 파일로 재지향.
       # 파일이 없으면 새로 만들고, 있으면 파일 끝에 덧붙입니다.

 |
       # 파이프.
       # 프로세스와 명령어를 엮어 주는 일반적인 목적의 툴.
       # ">"와 비슷하지만, 실제로는 좀 더 일반적으로 쓰입니다.
       # 명령어, 스크립트, 파일, 프로그램들을 함께 묶는데 유용하게 쓰입니다.
       cat *.txt | sort | uniq > result-file
       # 모든 *.txt 파일의 출력을 정렬한 다음, 중복되는 줄을 제거하고
       # 마지막으로 그 결과를 "result-file"에 저장.   

[출처] 쉘 스크립트|작성자 지혜


덧글

댓글 입력 영역


DNSErver

DNS server, DNS service

구글애드-세로


정사각디스플레이

통계 위젯 (화이트)

3724
443
754202

구글애드3