"Bash"의 두 판 사이의 차이

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기
잔글
잔글
 
(같은 사용자의 중간 판 30개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
Linux에서 많이 사용하는 Shell Script인 bash(Bourne Again Shell)를 정리 한다.
 
Linux에서 많이 사용하는 Shell Script인 bash(Bourne Again Shell)를 정리 한다.
<br>
 
  
==사용자 가이드==
+
== 사용자 가이드 ==
===Bash 실행 순서===
+
 
 +
=== Bash 실행 순서 ===
 +
 
 
*첫 로그인 시
 
*첫 로그인 시
 +
 
  /etc/profile
 
  /etc/profile
 
  ~/.bash_profile, ~/.bash_login, ~/.profile
 
  ~/.bash_profile, ~/.bash_login, ~/.profile
  
 
*Shell 실행시 마다
 
*Shell 실행시 마다
 +
 
  ~/.bashrc
 
  ~/.bashrc
  
 
*.bashrc 샘플
 
*.bashrc 샘플
 +
 
  alias showinfo='~/bin/showinfo.bash'
 
  alias showinfo='~/bin/showinfo.bash'
 
  alias dir='/bin/ls -alF'
 
  alias dir='/bin/ls -alF'
 
  alias dird='/bin/ls -alF | grep /'
 
  alias dird='/bin/ls -alF | grep /'
  
===Bash 인수===
+
=== Bash 인수 ===
*$# : 인수의 갯수
+
 
 +
*$#&nbsp;: 인수의 갯수
 +
 
 
:*$1, $2, $3, ...
 
:*$1, $2, $3, ...
 
:*shift
 
:*shift
 +
 
  for thing in "$@"; do
 
  for thing in "$@"; do
    echo $thing
+
    echo $thing
 
  done
 
  done
  
 
*bash -c 실행할_문자열
 
*bash -c 실행할_문자열
  
*~ 2> /dev/null : 표준 에러를 표시하지 않음
+
*~ 2> /dev/null&nbsp;: 표준 에러를 표시하지 않음
*~ 1>&2 /dev/null : 표준 출력과 표준 에러를 표시하지 않음
+
*~ 1>&2 /dev/null&nbsp;: 표준 출력과 표준 에러를 표시하지 않음
*${변수=값} : 변수에 값 지정
+
*${변수=값}&nbsp;: 변수에 값 지정
*${HADOOP_HOME:-${HADOOP_PREFIX}} : ${HADOOP_HOME}에 값이 없을 경우 ${HADOOP_PREFIX} 값을 사용
+
*${HADOOP_HOME:-${HADOOP_PREFIX}}&nbsp;: ${HADOOP_HOME}에 값이 없을 경우 ${HADOOP_PREFIX} 값을 사용
  
 
=== 표준 입출력 ===
 
=== 표준 입출력 ===
  
~ 2> /dev/null : 표준 에러를 표시하지 않음<br/>~ 1>&2 /dev/null : 표준 출력과 표준 에러를 표시하지 않음
+
표준 입력 (/dev/stdin)
 +
 
 +
*<
 +
*<<+<br/>Here document.<br/>+
 +
 
 +
표준 출력 (/dev/stdout)
 +
 
 +
*>
 +
*1>
 +
*> /dev/null 2>&1
 +
 
 +
표준 오류 (/dev/stderr)
 +
 
 +
*2> /dev/null
 +
*2> /dev/null 1>&2
 +
 
 +
=== 변수 편집 ===
 +
 
 +
Replace
 +
 
 +
${변수명/aaa/bbb}&nbsp;: 첫 aaa를 bbb로 변경
 +
 
 +
${변수명//aaa/bbb}&nbsp;: 모든 aaa를 bbb로 변경
 +
 
 +
 
 +
 
 +
참고 문헌
 +
 
 +
*[https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html https://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/string-manipulation.html]
 +
 
 +
=== Prompt ===
 +
 
 +
 
 +
<pre>PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '</pre>
 +
 
  
 
=== 기타 정리 ===
 
=== 기타 정리 ===
43번째 줄: 84번째 줄:
 
  funcShowinfo()
 
  funcShowinfo()
 
  {
 
  {
  ~/bin/showinfo_$1.bash
+
~/bin/showinfo_$1.bash
  echo '.'
+
echo '.'
 
  }
 
  }
 
  funcShowinfo "test"
 
  funcShowinfo "test"
66번째 줄: 107번째 줄:
 
   
 
   
 
  if [ "$1" = "centos" ]; then
 
  if [ "$1" = "centos" ]; then
  echo 'rarara'
+
echo 'rarara'
 
  fi
 
  fi
 
   
 
   
89번째 줄: 130번째 줄:
 
  case string in
 
  case string in
 
  "~") ~
 
  "~") ~
  &nbsp;;;
+
&nbsp;;;
 
  esac
 
  esac
  
110번째 줄: 151번째 줄:
 
  ~
 
  ~
 
  done<font face="sans-serif, Arial, Verdana, Trebuchet MS"><span style="white-space: normal;">
 
  done<font face="sans-serif, Arial, Verdana, Trebuchet MS"><span style="white-space: normal;">
 +
 +
 
   
 
   
 
  </span></font>
 
  </span></font>
  
==유용한 Tip==
+
== Bash Script 가이드 ==
===allowDBConnection===
+
 
 +
=== Bash Script 시작 표시 ===
 +
<pre>#!/usr/bin/env bash</pre>
 +
 
 +
 
 +
=== Bash Script 실행 ===
 +
 
 +
*chmod Bash_file<br/>Bash_file
 +
*source Bash_file&nbsp;: 스크립트에서 환경 설정한 것이 유지 된다.
 +
*. Bash_file&nbsp;: source Bash_file과 동일
 +
 
 +
 
 +
 
 +
=== Bash Script Arguments ===
 +
 
 +
{| cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
 +
|-
 +
| width="33%" align="center" valign="middle" style="background-color:#eee;" | Item
 +
| width="70%" align="center" valign="middle" style="background-color:#eee;" | Description
 +
|-
 +
| align="center" valign="middle" | $#
 +
| align="left" valign="middle" | Argument의 개수
 +
|-
 +
| align="center" valign="middle" | $1, $2, $3, ...
 +
| align="left" valign="middle" | Argument
 +
|-
 +
| align="center" valign="middle" | shift
 +
| align="left" valign="middle" | $1을 삭제하고 번호를 하나씩 줄인다.
 +
|}
 +
 
 +
 
 +
 
 +
=== 종료 코드 ===
 +
<pre>exit 종료_코드</pre>
 +
*0&nbsp;: 정상 종료
 +
*1 ~ 255&nbsp;: 비정상 종료
 +
*$?&nbsp;: 직전에 실행된 명령의 종료 코드
 +
 
 +
== 유용한 Tip ==
 +
 
 +
=== allowDBConnection ===
 +
 
 
  #!/bin/bash
 
  #!/bin/bash
 
  ### ================================================================================================
 
  ### ================================================================================================
  ###    프로그램 명     : allowDBConnection, Version 1.0
+
  ###    프로그램 명   &nbsp;: allowDBConnection, Version 1.0
  ###    프로그램 설명   : 특정 host에서 Database로의 접속을 허용 합니다.
+
  ###    프로그램 설명 &nbsp;: 특정 host에서 Database로의 접속을 허용 합니다.
  ###    작성자         : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
+
  ###    작성자         &nbsp;: 김계현 (pnuskgh@gmail.com, 010-5034-3931)
  ###    작성일         : 2002.09.27 ~ 2002.09.27
+
  ###    작성일         &nbsp;: 2002.09.27 ~ 2002.09.27
 
  ### ----[History 관리]------------------------------------------------------------------------------
 
  ### ----[History 관리]------------------------------------------------------------------------------
  ###    수정자         :
+
  ###    수정자         &nbsp;:
  ###    수정일         :
+
  ###    수정일         &nbsp;:
  ###    수정 내용       :
+
  ###    수정 내용     &nbsp;:
 
  ### ================================================================================================
 
  ### ================================================================================================
 
   
 
   
 
  ###---  Command Line에서 입력된 인수를 검사한다.
 
  ###---  Command Line에서 입력된 인수를 검사한다.
  if [[ $# = 4 ]]; then
+
  if [[$# = 4| $# = 4 ]]; then
  HOST=$1
+
HOST=$1
  DATABASE=$2
+
DATABASE=$2
  USER=$3
+
USER=$3
  PASSWORD=$4
+
PASSWORD=$4
  elif [[ $# = 5 ]]; then
+
  elif [[$# = 5| $# = 5 ]]; then
  HOST=$1
+
HOST=$1
  DATABASE=$2
+
DATABASE=$2
  USER=$3
+
USER=$3
  PASSWORD=$4
+
PASSWORD=$4
 
  else
 
  else
  /bin/echo "Using : allowDBConnection HOST DATABASE USER PASSWORD [ROOTPASSWORD]"
+
/bin/echo "Using&nbsp;: allowDBConnection HOST DATABASE USER PASSWORD [ROOTPASSWORD]"
  /bin/echo "        HOST           : 접속하려는 client의 host"
+
/bin/echo "        HOST         &nbsp;: 접속하려는 client의 host"
  /bin/echo "        DATABASE       : 접속을 허용하려는 Database"
+
/bin/echo "        DATABASE     &nbsp;: 접속을 허용하려는 Database"
  /bin/echo "        USER           : Database 사용자"
+
/bin/echo "        USER         &nbsp;: Database 사용자"
  /bin/echo "        PASSWORD       : Database 사용자의 암호"
+
/bin/echo "        PASSWORD     &nbsp;: Database 사용자의 암호"
  /bin/echo "        ROOTPASSWORD   : Database의 root 사용자의 암호"
+
/bin/echo "        ROOTPASSWORD &nbsp;: Database의 root 사용자의 암호"
  /bin/echo " "
+
/bin/echo " "
  exit
+
exit
 
  fi
 
  fi
 
   
 
   
 
  ###---  특정 host에서 Database로의 접속을 허용 합니다.
 
  ###---  특정 host에서 Database로의 접속을 허용 합니다.
  if [[ $# = 4 ]]; then
+
  if [[$# = 4| $# = 4 ]]; then
 
   
 
   
 
  /usr/bin/mysql -uroot -p <<+
 
  /usr/bin/mysql -uroot -p <<+
 
  connect mysql;
 
  connect mysql;
 
  insert into db
 
  insert into db
        values ('${HOST}', '${DATABASE}', '${USER}',
+
      values ('${HOST}', '${DATABASE}', '${USER}',
            'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
+
          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
            'Y','Y','Y','Y','Y','Y','Y','Y','Y');
+
          'Y','Y','Y','Y','Y','Y','Y','Y','Y');
 
  commit;
 
  commit;
 
  flush privileges;
 
  flush privileges;
168번째 줄: 252번째 줄:
 
  /usr/bin/mysql --user=root --password=${ROOTPASSWORD} mysql <<+
 
  /usr/bin/mysql --user=root --password=${ROOTPASSWORD} mysql <<+
 
  insert into db
 
  insert into db
        values ('${HOST}', '${DATABASE}', '${USER}',
+
      values ('${HOST}', '${DATABASE}', '${USER}',
            'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
+
          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
            'Y','Y','Y','Y','Y','Y','Y','Y','Y');
+
          'Y','Y','Y','Y','Y','Y','Y','Y','Y');
 
  commit;
 
  commit;
 
  flush privileges;
 
  flush privileges;
179번째 줄: 263번째 줄:
 
  fi
 
  fi
  
===backupInstance===
+
=== backupInstance ===
 +
 
 
  #!/bin/bash
 
  #!/bin/bash
 
  ### ================================================================================================
 
  ### ================================================================================================
  ###    프로그램 명     : backupInstance, Version 1.0
+
  ###    프로그램 명   &nbsp;: backupInstance, Version 1.0
  ###    프로그램 설명   : Sugar Instance와 Database를 백업 합니다.
+
  ###    프로그램 설명 &nbsp;: Sugar Instance와 Database를 백업 합니다.
  ###    작성자         : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
+
  ###    작성자         &nbsp;: 김계현 (pnuskgh@gmail.com, 010-5034-3931)
  ###    작성일         : 2002.07.15 ~ 2002.09.27
+
  ###    작성일         &nbsp;: 2002.07.15 ~ 2002.09.27
 
  ### ----[History 관리]------------------------------------------------------------------------------
 
  ### ----[History 관리]------------------------------------------------------------------------------
  ###    수정자         :
+
  ###    수정자         &nbsp;:
  ###    수정일         :
+
  ###    수정일         &nbsp;:
  ###    수정 내용       :
+
  ###    수정 내용     &nbsp;:
 
  ### ================================================================================================
 
  ### ================================================================================================
 
   
 
   
197번째 줄: 282번째 줄:
 
   
 
   
 
  ###---  Command Line에서 입력된 인수를 검사한다.
 
  ###---  Command Line에서 입력된 인수를 검사한다.
  if [[ $# = 4 ]]; then
+
  if [[$# = 4| $# = 4 ]]; then
  INSTANCE=$1
+
INSTANCE=$1
  DATABASE=$2
+
DATABASE=$2
  USER=$3
+
USER=$3
  PASSWORD=$4
+
PASSWORD=$4
 
  else
 
  else
  /bin/echo "Using : backupInstance INSTANCE DATABASE USER PASSWORD"
+
/bin/echo "Using&nbsp;: backupInstance INSTANCE DATABASE USER PASSWORD"
  /bin/echo "        INSTANCE       : Sugar Instance"
+
/bin/echo "        INSTANCE     &nbsp;: Sugar Instance"
  /bin/echo "        DATABASE       : Database"
+
/bin/echo "        DATABASE     &nbsp;: Database"
  /bin/echo "        USER           : Database 사용자"
+
/bin/echo "        USER         &nbsp;: Database 사용자"
  /bin/echo "        PASSWORD       : Database 사용자의 암호"
+
/bin/echo "        PASSWORD     &nbsp;: Database 사용자의 암호"
  /bin/echo " "
+
/bin/echo " "
  exit
+
exit
 
  fi
 
  fi
 
   
 
   
221번째 줄: 306번째 줄:
 
  clear
 
  clear
 
  /bin/echo "--------------------------------------------------"
 
  /bin/echo "--------------------------------------------------"
  /bin/echo "Backup folder : " ${BACKUP_DIR}
+
  /bin/echo "Backup folder&nbsp;: " ${BACKUP_DIR}
  /bin/echo "Backup datetime : " `date +%Y%m%d_%H%M%S`
+
  /bin/echo "Backup datetime&nbsp;: " `date +%Y%m%d_%H%M%S`
 
  /bin/echo " "  
 
  /bin/echo " "  
 
   
 
   
 
  /bin/ls -alF ${BACKUP_DIR}
 
  /bin/ls -alF ${BACKUP_DIR}
  
===Watchdog Tomcat===
+
=== Watchdog Tomcat ===
 +
 
 
*Apache Tomcat을 모니터링하고 있다가 죽었을 경우 살려주는 Script
 
*Apache Tomcat을 모니터링하고 있다가 죽었을 경우 살려주는 Script
 +
 
:*watchdogTomcat.csh
 
:*watchdogTomcat.csh
 +
 
  #!/bin/csh
 
  #!/bin/csh
 
  ###---  Default 환경변수를 설정한다.
 
  ###---  Default 환경변수를 설정한다.
251번째 줄: 339번째 줄:
 
  ###---      Process가 죽었을 경우 다시 살린다.
 
  ###---      Process가 죽었을 경우 다시 살린다.
 
  if ("${procPID}" == "") then
 
  if ("${procPID}" == "") then
    ${PROC_STOP}    >& /dev/null
+
  ${PROC_STOP}    >& /dev/null
    ${PROC_START}  >& /dev/null
+
  ${PROC_START}  >& /dev/null
    \/bin/echo  "----------------------------------------"  >> ${JOB_LOG}
+
  \/bin/echo  "----------------------------------------"  >> ${JOB_LOG}
    \/bin/echo  "---    ${PROC_NAME} 재기동"                >> ${JOB_LOG}
+
  \/bin/echo  "---    ${PROC_NAME} 재기동"                >> ${JOB_LOG}
    \/bin/date                                              >> ${JOB_LOG}
+
  \/bin/date                                              >> ${JOB_LOG}
    \/bin/echo  " "                                        >> ${JOB_LOG}
+
  \/bin/echo  " "                                        >> ${JOB_LOG}
 
  endif
 
  endif
 
   
 
   
267번째 줄: 355번째 줄:
 
  ###---  환경변수를 설정한다.
 
  ###---  환경변수를 설정한다.
 
  set    PROC_NAME="Apache Tomcat 서버"                      ### Process 명
 
  set    PROC_NAME="Apache Tomcat 서버"                      ### Process 명
                                                            ### Process를 확인할 수 있는 문자열
+
                                                          ### Process를 확인할 수 있는 문자열
 
  set    PROC_STR="Dcatalina.home=/usr/local/tomcat6"
 
  set    PROC_STR="Dcatalina.home=/usr/local/tomcat6"
                                                            ### Process Stop 명령어
+
                                                          ### Process Stop 명령어
 
  set    PROC_STOP="service tomcat6 stop"
 
  set    PROC_STOP="service tomcat6 stop"
                                                            ### Process Start 명령어
+
                                                          ### Process Start 명령어
 
  set    PROC_START="service tomcat6 start"
 
  set    PROC_START="service tomcat6 start"
 
  set    JOB_LOG="/root/logs/watchdog.log"                  ### 현재 프로그램이 처리한 Log 파일
 
  set    JOB_LOG="/root/logs/watchdog.log"                  ### 현재 프로그램이 처리한 Log 파일
281번째 줄: 369번째 줄:
 
   
 
   
 
  switch ("$argv[1]")
 
  switch ("$argv[1]")
    case    "-check":
+
  case    "-check":
        set    flagCheck="true"
+
      set    flagCheck="true"
        shift
+
      shift
        breaksw
+
      breaksw
    case    "-help":
+
  case    "-help":
        goto    theUsing
+
      goto    theUsing
    case    "-time":
+
  case    "-time":
        shift
+
      shift
        if ($#argv < 1)  goto    theUsing
+
      if ($#argv < 1)  goto    theUsing
        set    timeSecond="$argv[1]"
+
      set    timeSecond="$argv[1]"
        shift
+
      shift
        breaksw
+
      breaksw
    default:
+
  default:
        goto    theUsing
+
      goto    theUsing
        breaksw
+
      breaksw
 
  endsw
 
  endsw
 
   
 
   
301번째 줄: 389번째 줄:
 
   
 
   
 
  theUsing:
 
  theUsing:
  \/bin/echo  "Using : watchdogTomcat.csh [-help] [-time sec] [-check]"
+
  \/bin/echo  "Using&nbsp;: watchdogTomcat.csh [-help] [-time sec] [-check]"
  \/bin/echo  "          -help       : 프로그램에 대한 사용법을 보여준다."
+
  \/bin/echo  "          -help     &nbsp;: 프로그램에 대한 사용법을 보여준다."
  \/bin/echo  "          -time sec   : 초 단위로 Process를 검사할 간격을 설정한다. (default. 60)"
+
  \/bin/echo  "          -time sec &nbsp;: 초 단위로 Process를 검사할 간격을 설정한다. (default. 60)"
  \/bin/echo  "          -check     : 한번만 검사를 한다. (crontab에서 사용할 경우를 위해)"
+
  \/bin/echo  "          -check     &nbsp;: 한번만 검사를 한다. (crontab에서 사용할 경우를 위해)"
 
  \/bin/echo  " "
 
  \/bin/echo  " "
 
  exit
 
  exit
  
===파일 목록 추가===
+
=== 파일 목록 추가 ===
 +
 
 
  CLASSPATHA=/nas/appl/flume/lib
 
  CLASSPATHA=/nas/appl/flume/lib
 
  for file in /nas/appl/flume/lib/*.jar
 
  for file in /nas/appl/flume/lib/*.jar
 
  do
 
  do
  CLASSPATHA=${CLASSPATHA}:${file}
+
CLASSPATHA=${CLASSPATHA}:${file}
 
  done
 
  done
  
===Disk 용량 확인===
+
=== Disk 용량 확인 ===
 +
 
 
*폴더별 사용 용량 확인
 
*폴더별 사용 용량 확인
 +
 
  du -s -m *
 
  du -s -m *
  
==awk==
+
== awk ==
 +
 
 
*명령행
 
*명령행
 +
 
  awk  'pattern  {action}' file
 
  awk  'pattern  {action}' file
 
  awk  -f  awkfile  file
 
  awk  -f  awkfile  file
  
 
*Pattern
 
*Pattern
 +
 
  BEGIN                  //--- 시작전 실행
 
  BEGIN                  //--- 시작전 실행
 
  END                    //--- 종료후 실행
 
  END                    //--- 종료후 실행
 
  /정규식/              //--- 정규식을 만족하면 실행
 
  /정규식/              //--- 정규식을 만족하면 실행
  expression            //--- 참일 경우 실행 (not zero, not null), &&(and), ||(or) !(not)
+
  expression            //--- 참일 경우 실행 (not zero, not null), &&(and), ||(or)&nbsp;!(not)
 
  pattern1, pattern2    //--- pattern1과 pattern2 사이의 라인에서 실행
 
  pattern1, pattern2    //--- pattern1과 pattern2 사이의 라인에서 실행
  
 
*Action
 
*Action
 +
 
  print $1, $2
 
  print $1, $2
 
  printf(format, ...)
 
  printf(format, ...)
 
  if (~) ~ else ~
 
  if (~) ~ else ~
    var ~pattern : var 변수가 pattern에 일치하면 참
+
  var ~pattern &nbsp;: var 변수가 pattern에 일치하면 참
    var !~pattern : var 변수가 pattern에 일치하지 않으면 참
+
  var&nbsp;!~pattern&nbsp;: var 변수가 pattern에 일치하지 않으면 참
 
  while (~) ~
 
  while (~) ~
 
  for (~;~;~) ~
 
  for (~;~;~) ~
347번째 줄: 442번째 줄:
  
 
*Variables
 
*Variables
 +
 
  FILENAME    //--- 파일 이름
 
  FILENAME    //--- 파일 이름
 
  FS          //--- 입력 필드 분리자
 
  FS          //--- 입력 필드 분리자
354번째 줄: 450번째 줄:
  
 
*내장 함수
 
*내장 함수
 +
 
  length(x)    //--- 문자의 길이
 
  length(x)    //--- 문자의 길이
 
  int(x)        //--- x의 정수값
 
  int(x)        //--- x의 정수값
365번째 줄: 462번째 줄:
  
 
*참고 문헌
 
*참고 문헌
:*http://www.dreamy.pe.kr/zbxe/CodeClip/6332
+
 
 +
:*[http://www.dreamy.pe.kr/zbxe/CodeClip/6332 http://www.dreamy.pe.kr/zbxe/CodeClip/6332]
 +
 
 +
 
 +
 
 +
== 파일 편집 ==
 +
 
 +
sed
 +
<pre>echo "NOZEROCONF=yes" >> /etc/sysconfig/network      #--- 마지막에 문자열 추가
 +
sed -i '/source/i\
 +
&nbsp;      new prev content' fileName                    #--- source 이전줄에 추가
 +
sed -i '/source/c\
 +
&nbsp;      new prev content' fileName                    #--- source 줄을 교체
 +
sed -i '/source/a\
 +
&nbsp;      new next content' fileName                    #--- source 다음줄에 추가
 +
sed -i '/source/r textfile' fileName                  #--- source 다음줄에 textfile을 읽어서 추가
 +
 
 +
sed -i 's/source/target/g' fileName                  #--- 문자열 치환 (Substitute)
 +
sed -i 's/hello/& world/g' fileName                  #--- &는 패턴 매칭된 부분임
 +
 
 +
sed -i '/source/d' fileName                          #--- 삭제 (Delete)
 +
 
 +
sed '/source/p' fileName                              #--- 문자열 출력 (Print)
 +
 
 +
sed -e script
 +
sed -f script_file
 +
sed -r 정규표현식
 +
 
 +
find . -type f -print0 | xargs -0 's/source/target/g'
 +
 
 +
</pre>
 +
<br/>yum &nbsp;-y &nbsp;install crudini
 +
<pre>crudini --set [OPTION]...  config_file section  [param] [value]
 +
crudini --get [OPTION]...  config_file [section] [param]
 +
crudini --del [OPTION]...  config_file section  [param] [list value]
 +
crudini --merge [OPTION]... config_file [section]</pre>
 +
<br/>xargs&nbsp;: 앞 명령어의 출력을 뒷 명령어의 인자로 전달
 +
<pre>ls -alF | xargs echo
 +
ls | xargs -i cp {} ./backup_files
 +
​ls | xargs -l{} cp {} ./backup_files</pre>
 +
<br/>참고 문헌
 +
 
 +
*[http://so-blog.net/2016/04/22/sed/ http://so-blog.net/2016/04/22/sed/]
  
 
== 참고 문헌 ==
 
== 참고 문헌 ==
372번째 줄: 511번째 줄:
  
 
*[http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/ 고급 Bash 스크립팅 가이드]
 
*[http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/ 고급 Bash 스크립팅 가이드]
 +
*[https://github.com/denysdovhan/bash-handbook/blob/master/translations/ko-KR/README.md Bash Handbook]
 
*[http://wiki.kldp.org/Translations//html/Shell_Programming-KLDP/index.html Shell 프로그래밍의 기본]
 
*[http://wiki.kldp.org/Translations//html/Shell_Programming-KLDP/index.html Shell 프로그래밍의 기본]
 
*[http://unix.co.kr/bbs/board.php?bo_table=02_11&wr_id=24 BASH 쉘 스크립팅 입문: 버전 1.2]
 
*[http://unix.co.kr/bbs/board.php?bo_table=02_11&wr_id=24 BASH 쉘 스크립팅 입문: 버전 1.2]

2017년 3월 28일 (화) 18:33 기준 최신판

Linux에서 많이 사용하는 Shell Script인 bash(Bourne Again Shell)를 정리 한다.

사용자 가이드

Bash 실행 순서

  • 첫 로그인 시
/etc/profile
~/.bash_profile, ~/.bash_login, ~/.profile
  • Shell 실행시 마다
~/.bashrc
  • .bashrc 샘플
alias showinfo='~/bin/showinfo.bash'
alias dir='/bin/ls -alF'
alias dird='/bin/ls -alF | grep /'

Bash 인수

  • $# : 인수의 갯수
  • $1, $2, $3, ...
  • shift
for thing in "$@"; do
   echo $thing
done
  • bash -c 실행할_문자열
  • ~ 2> /dev/null : 표준 에러를 표시하지 않음
  • ~ 1>&2 /dev/null : 표준 출력과 표준 에러를 표시하지 않음
  • ${변수=값} : 변수에 값 지정
  • ${HADOOP_HOME:-${HADOOP_PREFIX}} : ${HADOOP_HOME}에 값이 없을 경우 ${HADOOP_PREFIX} 값을 사용

표준 입출력

표준 입력 (/dev/stdin)

  • <
  • <<+
    Here document.
    +

표준 출력 (/dev/stdout)

  • >
  • 1>
  • > /dev/null 2>&1

표준 오류 (/dev/stderr)

  • 2> /dev/null
  • 2> /dev/null 1>&2

변수 편집

Replace

${변수명/aaa/bbb} : 첫 aaa를 bbb로 변경

${변수명//aaa/bbb} : 모든 aaa를 bbb로 변경


참고 문헌

Prompt

PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '


기타 정리

#!/bin/bash
STR_DATE=`date +%Y%m%d_%H%M%S`
${STR_DATE}

funcShowinfo()
{
~/bin/showinfo_$1.bash
echo '.'
}
funcShowinfo "test"


  • 연월일 표시
#--- CentOS에서
date +%Y%m%d_%H%M%S
  • kill `ps -C ~ -o pid=`
  • Script Arguments : $1
test ~ = ~
[ ~ = ~ ]
echo $?
if  $# < 5; then

if [ "$1" = "centos" ]; then
echo 'rarara'
fi

if ~; then
~
elif ~ ; then
~
else
~
fi
while ~
do
~
done
until ~
do
~
done
case string in
"~") ~
 ;;
esac
for hostname in "controller001" "controller002" "controller003"; do
    echo ${hostname}
done

for ~ in [list]
do
~
done
for ~
do
~
done
select ~ in [~]
do
~
done




Bash Script 가이드

Bash Script 시작 표시

#!/usr/bin/env bash


Bash Script 실행

  • chmod Bash_file
    Bash_file
  • source Bash_file : 스크립트에서 환경 설정한 것이 유지 된다.
  • . Bash_file : source Bash_file과 동일


Bash Script Arguments

Item Description
$# Argument의 개수
$1, $2, $3, ... Argument
shift $1을 삭제하고 번호를 하나씩 줄인다.


종료 코드

exit 종료_코드
  • 0 : 정상 종료
  • 1 ~ 255 : 비정상 종료
  • $? : 직전에 실행된 명령의 종료 코드

유용한 Tip

allowDBConnection

#!/bin/bash
### ================================================================================================
###     프로그램 명     : allowDBConnection, Version 1.0
###     프로그램 설명   : 특정 host에서 Database로의 접속을 허용 합니다.
###     작성자          : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
###     작성일          : 2002.09.27 ~ 2002.09.27
### ----[History 관리]------------------------------------------------------------------------------
###     수정자          :
###     수정일          :
###     수정 내용       :
### ================================================================================================

###---  Command Line에서 입력된 인수를 검사한다.
if  $# = 4 ; then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
elif  $# = 5 ; then
HOST=$1
DATABASE=$2
USER=$3
PASSWORD=$4
else
/bin/echo "Using : allowDBConnection HOST DATABASE USER PASSWORD [ROOTPASSWORD]"
/bin/echo "        HOST           : 접속하려는 client의 host"
/bin/echo "        DATABASE       : 접속을 허용하려는 Database"
/bin/echo "        USER           : Database 사용자"
/bin/echo "        PASSWORD       : Database 사용자의 암호"
/bin/echo "        ROOTPASSWORD   : Database의 root 사용자의 암호"
/bin/echo " "
exit
fi

###---  특정 host에서 Database로의 접속을 허용 합니다.
if  $# = 4 ; then

/usr/bin/mysql -uroot -p <<+
connect mysql;
insert into db
     values ('${HOST}', '${DATABASE}', '${USER}',
         'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
         'Y','Y','Y','Y','Y','Y','Y','Y','Y');
commit;
flush privileges;
grant all privileges on ${DATABASE}.* to ${USER}@${HOST} identified by '${PASSWORD}';
exit
+

else

/usr/bin/mysql --user=root --password=${ROOTPASSWORD} mysql <<+
insert into db
     values ('${HOST}', '${DATABASE}', '${USER}',
         'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
         'Y','Y','Y','Y','Y','Y','Y','Y','Y');
commit;
flush privileges;
grant all privileges on ${DATABASE}.* to ${USER}@${HOST} identified by '${PASSWORD}';
exit
+

fi

backupInstance

#!/bin/bash
### ================================================================================================
###     프로그램 명     : backupInstance, Version 1.0
###     프로그램 설명   : Sugar Instance와 Database를 백업 합니다.
###     작성자          : 김계현 (pnuskgh@gmail.com, 010-5034-3931)
###     작성일          : 2002.07.15 ~ 2002.09.27
### ----[History 관리]------------------------------------------------------------------------------
###     수정자          :
###     수정일          :
###     수정 내용       :
### ================================================================================================

###---  Default 환경변수를 설정한다.
WEB_ROOT=/var/www/html
BACKUP_DIR=/data/backup

###---  Command Line에서 입력된 인수를 검사한다.
if  $# = 4 ; then
INSTANCE=$1
DATABASE=$2
USER=$3
PASSWORD=$4
else
/bin/echo "Using : backupInstance INSTANCE DATABASE USER PASSWORD"
/bin/echo "        INSTANCE       : Sugar Instance"
/bin/echo "        DATABASE       : Database"
/bin/echo "        USER           : Database 사용자"
/bin/echo "        PASSWORD       : Database 사용자의 암호"
/bin/echo " "
exit
fi

###---  Sugar Instance를 백업 합니다.
cd ${WEB_ROOT}
/bin/tar cvf ${BACKUP_DIR}/${INSTANCE}_`date +%Y%m%d_%H%M%S`.tar ${INSTANCE}

/usr/bin/mysqldump --user=${USER} --password=${PASSWORD} ${DATABASE} > ${BACKUP_DIR}/${DATABASE}_DB_`date +%Y%m%d_%H%M%S`.sql
/bin/tar cvf ${BACKUP_DIR}/${DATABASE}_DB_`date +%Y%m%d_%H%M%S`.tar /var/lib/mysql/${DATABASE}

clear
/bin/echo "--------------------------------------------------"
/bin/echo "Backup folder : " ${BACKUP_DIR}
/bin/echo "Backup datetime : " `date +%Y%m%d_%H%M%S`
/bin/echo " " 

/bin/ls -alF ${BACKUP_DIR}

Watchdog Tomcat

  • Apache Tomcat을 모니터링하고 있다가 죽었을 경우 살려주는 Script
  • watchdogTomcat.csh
#!/bin/csh
###---  Default 환경변수를 설정한다.
goto    theSet
theSetEnd:

###---  인수의 초기값을 설정한다.
set     timeSecond="60"                                     ### Process를 검사할 간격
set     flagCheck="false"                                   ### true일 경우 한번만 검사를 한다.

###---      Command Line에서 입력된 인수를 검사한다.
goto    theArg
theArgEnd:

###---  Process를 검사한다.
theStart: 

###---      Process를 확인한다.
set     procPID=`/bin/ps -ef | /bin/grep -v /bin/grep | /bin/grep "${PROC_STR}" | /bin/awk '{print $2}'`

###---      Process가 죽었을 경우 다시 살린다.
if ("${procPID}" == "") then
  ${PROC_STOP}    >& /dev/null
  ${PROC_START}   >& /dev/null
  \/bin/echo  "----------------------------------------"  >> ${JOB_LOG}
  \/bin/echo  "---    ${PROC_NAME} 재기동"                >> ${JOB_LOG}
  \/bin/date                                              >> ${JOB_LOG}
  \/bin/echo  " "                                         >> ${JOB_LOG}
endif

###---      "-check" 인수가 있을 경우 처리를 종료하고, 없을 경우 timeSecond만큼 sleep한후 다시 검사한다.
if ("${flagCheck}" == "true")   exit
/bin/sleep   ${timeSecond}
goto theStart

theSet:
###---  환경변수를 설정한다.
set     PROC_NAME="Apache Tomcat 서버"                      ### Process 명
                                                          ### Process를 확인할 수 있는 문자열
set     PROC_STR="Dcatalina.home=/usr/local/tomcat6"
                                                          ### Process Stop 명령어
set     PROC_STOP="service tomcat6 stop"
                                                          ### Process Start 명령어
set     PROC_START="service tomcat6 start"
set     JOB_LOG="/root/logs/watchdog.log"                   ### 현재 프로그램이 처리한 Log 파일

goto    theSetEnd

theArg:
if ($#argv < 1)   goto    theArgEnd

switch ("$argv[1]")
  case    "-check":
      set     flagCheck="true"
      shift
      breaksw
  case    "-help":
      goto    theUsing
  case    "-time":
      shift
      if ($#argv < 1)   goto    theUsing
      set     timeSecond="$argv[1]"
      shift
      breaksw
  default:
      goto    theUsing
      breaksw
endsw

goto    theArg

theUsing:
\/bin/echo   "Using : watchdogTomcat.csh [-help] [-time sec] [-check]"
\/bin/echo   "           -help       : 프로그램에 대한 사용법을 보여준다."
\/bin/echo   "           -time sec   : 초 단위로 Process를 검사할 간격을 설정한다. (default. 60)"
\/bin/echo   "           -check      : 한번만 검사를 한다. (crontab에서 사용할 경우를 위해)"
\/bin/echo   " "
exit

파일 목록 추가

CLASSPATHA=/nas/appl/flume/lib
for file in /nas/appl/flume/lib/*.jar
do
CLASSPATHA=${CLASSPATHA}:${file}
done

Disk 용량 확인

  • 폴더별 사용 용량 확인
du -s -m *

awk

  • 명령행
awk  'pattern  {action}' file
awk  -f  awkfile  file
  • Pattern
BEGIN                  //--- 시작전 실행
END                    //--- 종료후 실행
/정규식/               //--- 정규식을 만족하면 실행
expression             //--- 참일 경우 실행 (not zero, not null), &&(and), ||(or) !(not)
pattern1, pattern2     //--- pattern1과 pattern2 사이의 라인에서 실행
  • Action
print $1, $2
printf(format, ...)
if (~) ~ else ~
 var ~pattern  : var 변수가 pattern에 일치하면 참
 var !~pattern : var 변수가 pattern에 일치하지 않으면 참
while (~) ~
for (~;~;~) ~
for (~ in ~) ~
do ~ while (~)
break, continue
next
exit
exit expression
  • Variables
FILENAME     //--- 파일 이름
FS           //--- 입력 필드 분리자
NR           //--- 현재 행번호
NF           //--- 현재 행의 필드 갯수
OFS          //--- 출력되는 필드의 분리자
  • 내장 함수
length(x)     //--- 문자의 길이
int(x)        //--- x의 정수값
substr(str, start, len)   //--- str 문자열에서 start부터 len개의 문자 반환
sub(from, to, str)        //--- str 문자열에서 첫번째 from을 to로 치환
gsub(from, to, str)       //--- str 문자열에서 모든 from을 to로 치환
split(str, array, sep)    //--- str 문자열을 sep 문자열로 구분하여 쪼개어 array에 저장 (array[1])
toupper(str)
tolower(str)
system(command)           //--- 명령을 실행하고 exit 상태를 반환
  • 참고 문헌


파일 편집

sed

echo "NOZEROCONF=yes" >> /etc/sysconfig/network       #--- 마지막에 문자열 추가
sed -i '/source/i\
       new prev content' fileName                     #--- source 이전줄에 추가
sed -i '/source/c\
       new prev content' fileName                     #--- source 줄을 교체
sed -i '/source/a\
       new next content' fileName                     #--- source 다음줄에 추가
sed -i '/source/r textfile' fileName                  #--- source 다음줄에 textfile을 읽어서 추가

sed -i 's/source/target/g' fileName                   #--- 문자열 치환 (Substitute)
sed -i 's/hello/& world/g' fileName                   #--- &는 패턴 매칭된 부분임 

sed -i '/source/d' fileName                           #--- 삭제 (Delete)

sed '/source/p' fileName                              #--- 문자열 출력 (Print)

sed -e script
sed -f script_file
sed -r 정규표현식

find . -type f -print0 | xargs -0 's/source/target/g'


yum  -y  install crudini

crudini --set [OPTION]...   config_file section   [param] [value]
crudini --get [OPTION]...   config_file [section] [param]
crudini --del [OPTION]...   config_file section   [param] [list value]
crudini --merge [OPTION]... config_file [section]


xargs : 앞 명령어의 출력을 뒷 명령어의 인자로 전달

ls -alF | xargs echo
ls | xargs -i cp {} ./backup_files
​ls | xargs -l{} cp {} ./backup_files


참고 문헌

참고 문헌

  • 모니터링