실무에서 자주 사용되는 쉘 스크립트  #4
           (ping을 이용한 서버 모니터링)




  지난강좌(#3)는 MySQL에 관련된 편리한 스크립트를 만들어 보았다.
금번 강좌에서는 ping명령을 이용하여 나의 서버들을 관리할 수 있는 서버모니터링 프로그램을 만들어 보도록 하겠다. ping 명령어를 이용하여 단순하게 테스트를 할 것이다.
  단순히 한 서버만 ping 테스트 한다면 좋겠지만, 내가 관리하는 서버가 여러대라면, 하나 하나 하기엔 힘든 일이다. 쉘스크립트를 이용하여 많은 서버를 관리 할 수 있도록 만들어 보겠다.


먼저, 어떤일을 할 것인지 생각 해 보자...



1) ping 명령어로 서버를 점검한다?
  ping 명령어로 서버가 죽었는지 살았는지 확인 할 수 있다. 물론 서버나 네트웍 장비에서 ping을 막는다면, 불가능 한 일이지만, 그렇지 않다는 가정하에서 ping 명령어를 이용하겠다.

  (1) 서버 점검
    ping 아이피

  위와같이 명령어를 입력하면, 정상적 이라면, 지속적으로 응답시간을 보여 주게된다.


  (2) ping을 한번만 테스트 하려면?
    ping -c 1  아이피

    이렇게 하면, ping 테스트를 한번만 한다. 정상적일 때는 응답이 빠른데 실패는 너무 느리다.


  (3) ping 테스트시 응답을 기다리는 시간을 줄이려면?
    ping -c 1 -w 1 아이피

   위와같이 하면, 응답이 없더라도 1초만 기다리게 된다.


  이제 ping 명령으로 특정 서버를 점검할 준비가 되었다. 




2) 서버의 응답 결과를 쉘에서 처리하자!
  ping 명령의 결과는 사용자가 보기 좋은 형태로 나타난다. 하지만, 프로그램을 작성하기 위해서는 단순하게 "된다" 혹은 "안된다" 정도가 편리하다. 모든 명령어는 명령어 실행 결과를 리턴하게 되어 있다. 대부분 정상적으로 작동하였으면 0 , 아니면 에러코드 를 리턴한다.

  bash쉘에서 바로 전 명령어의 리턴값을 받아오는 변수가 있다 "$?"  이다.
 이 변수를 가지고 다음과 같이 ping 명령의 결과를 처리 할 수 있다.

 
ping -c 1 -w 1 아이피 &> /dev/null
  if [ "$?" == "0" ] ; then
     echo "정상"
  else
     echo "비정상"
  fi


 위 명령으로 ping 결과에 대한 리턴값을 받게 되며, 결과값이 0이면 "정상"을 출력하고 아니면, "비정상"을 출력하게 된다.
  ping 명령어의 출력은 /dev/null으로 보내 버린다^^



3) 서버 리스트를 입력하자
   내 서버가 여러대라면, 서버 리스트를 입력해야 한다. 여기서는 쉘스크립트의 배열을 사용하도록 한다.
 
  (1) 배열을 입력한다.
    server[0]="192.168.0.100"
    server[1]="192.168.0.1"

위와같이 배열으로 선언했다.
server 라는 배열에 0번째 주소에서는 "192.168.0.100"
server 라는 배열에 1번째 주소에서는 "192.168.0.100"

서버가 많이 있다면, 많이 넣어주면 된다.^^


  (2) 배열의 내용을 보여준다.
     echo ${server[0]}

위와같이 출력할 수 있다.


  (3) 배열의 크기가 궁금하다?
    echo ${#server[*]}


  (4) 배열의 모든 내용을 출력하려면?
    echo ${server[*]}


우리는 이렇게 서버 리스트를 배열에 넣었고 데이터를 확인 했다.



4) '3)'에서 넣었던 데이터를 '2)'의 ping 명령으로 점검해 보도록 하자!
  이제 반복문 인 for 문을 알아 보자.  #3 강좌에서는 for in 문을 배웠지만, 지금 사용하는 for 문은 일반적인 언어에 있는 for 문이다. c 언어의 그것과 비슷하니 살펴 보도록 하자.


for (( 표현식1 ; 표현식2 ; 표현식3 )) ; do
  <명령어들>
done

일반적인 언어와 같이 "표현식1"은 초기에 1번만 실행된다.
"표현식2"는 조건문이 들어간다.
"표현식3"은 증감문이 들어간다.

다음 예제를 보자

for (( i=1 ; i<=10 ; i++ )) ; do
  echo "$i"
done

위 예는 1부터 10까지 1씩 증가하면서 출력하는 프로그램이다.




그렇다면, '3)'에서 넣었던 서버리스트를 '2)'의 명령어로 점검해 보자.

for (( i=0 ; i<${#server[*]} ; i++ )) ; do
  ping -c 1 -w 1
${server[$i]}  &> /dev/null
  if [ "$?" == "0" ] ; then
    echo "${server[$i]}  .. 정상"
  else
    echo "${server[$i]}  .. 비정상"
  fi
done


위와같이 하면, 0번부터 배열의 크기만큼 반복해서 ping 테스트를 하고,
 결과를 서버 IP와 함께 정상 / 비정상 보여 준다.




5) 우리의 목적을 달성해 보자..
 위에서 알아본 것들을 응용해서 다음과 같이 우리가 원하는 쉘스크립트를 만들어 보자.

server[0]="192.168.0.100"
server[1]="192.168.0.1"


for (( i=0 ; i<${#server[*]} ; i++ )) ; do
  ping -c 1 -w 1
${server[$i]} &> /dev/null
  if [ "$?" == "0" ] ; then
    echo "${server[$i]}  .. 정상"
  else
    echo "${server[$i]}  .. 비정상"
  fi
done


위 쉘스크립트를 이용하여 간단하게 서버가 죽었는지 살아 있는지 점검 할 수 있다.



우리는 이것으로
 아주 쉽게 서버를 점검 할 수 있는 프로그램을 만들었다. 우리는 위 스크립트를 작성하면서 ping명령어 배열, if, for 문을 알게 되었다.
 서버가 100대라면 100번 입력하지 않아도 간단한 스크립트 하나로 점검할 수 있다. 난 시간을 save 했다!!   넘넘 뿌듯하다^^..

'OS > LINUX' 카테고리의 다른 글

쉘 스크립트 #6  (0) 2011.05.14
쉘스크립트 ex5  (0) 2011.05.14
쉘스크립트 Example2  (0) 2011.05.14
쉘스크립트 example  (0) 2011.05.14
egrep , awk  (0) 2011.05.14
실무에서 자주 사용되는 쉘 스크립트  #2
           (MySQL DB관리 유틸리티)




  지난번, 강좌(apache 자동 재 시작 프로그램)에 이어 실무에서 자주 사용되는 쉘 스크립트에 대한 강좌를 써 내려 가겠다. 물론 최대한 쉽고 최소한의 라인 수로 작성 가능한 쉘 스크립트에 대한 강좌를 쓸 것이다.
   금번 강좌는 MySQL을 쉽게 관리 할 수 있는 툴이다. 서버 관리를 하다 보면, mysql 접속하여 여러가지 sql문으로 서버 상태를 알아 보거나, 모니터링 해야 할 때가 있다. 이럴 때 마다 로그인을 해서, sql문을 얻어내는 것은 아주 귀찮은 일이고, 또 익숙하지 않으면 아주 오랜 시간이 소요되는 작업이다.  내가 만들고자 하는 스크립트는 이런 작업을 쉽게 해 줄 수 있는 스크립트를 만드는 것이다.

먼저, 어떤일을 할 것인지 생각 해 보자...


1) MySQL의 프로세스 리스트를 보려면?
   mysql의 프로세스 리스트는 ps 등의 명령어로 쉽게 볼 수 있다. 난 그런 것을 원하는 것이 아니고, 각 프로세스들이 하는 일들을 보고 싶다. mysql은 다음과 같은 방법으로 이런 일이 가능하게 제공한다.
 
   mysqladmin -u root -p processlist

또는

   mysql 접속한 상태에서
   show processlist;

나는 일괄적으로 다음과 같은 방법으로 mysql 명령을 실행 시킬 것이다.

echo "쿼리;" | mysql -u"root" -p"비밀번호"

위 명령어는 다음과 같다.
 echo "쿼리; " : "쿼리;"를 출력한다.
| : 파이프, 앞 명령어의 내용을 뒷 명령어의 표준 입력으로 넣는다.
mysql -u"root" -p"비밀번호" : mysql 서버에 접속한다. "비밀번호"는 서버의 비밀번호를 넣어준다.

우리가 원하는 일은 다음과 같이 한다.

echo "show processlist;" | mysql -u"root" -p"비밀번호"





 2) root로 그냥 접속만 하려면?
  '1)'의 프로세스 리스트를 보는 것 보다 쉽다. 단순하게..

mysql -u"root" -p"비밀번호"


이렇게만 하면 끝난다.



 3) MySQL에 존재하는 database 들을 보려면?
  '1)'의 프로세스 리스트를 응용하면,

echo "show databases;" | mysql -u"root" -p"비밀번호"

이렇게만 하면 끝난다.


 이정도 했으면, 원하는 쿼리들을 위와 같은 방법으로 자유롭게 추가 할 수 있을 것이다.
내가 원하는 것은 위 명령어들을 모아서 쓰기 편리한 메뉴 방식으로 만드는 것이다.
어떻게 할까???
  나는 키보드로 특정 문자들을 입력받아 변수에 넣을 것이다. 그리고 그 변수에 따라 위 명령어들을 실행 시킬 것이다. 이런 작업들을 특정 문자가 입력될 때 까지 반속 할 것이다.



 4) 쉘 프로그램에서 키보드 입력 받기
 
나는 쉘 프로그램에서 키보드로 입력을 받아서 변수에 넣을 것이다. 어떻게 해야 할까

read <변수>
 
no라는 변수에 입력값을 넣으려면 다음과 같이 한다.
read no

이렇게 하면, '엔터'키를 누를 때 까지 입력을 받는다.

read no
echo "$no"

위와같이 하면 간단하게 입력받은 문자를 출력해서 보여 줄 수 있다.


5) 입력된 문자에 따라서 프로그램 실행 시키기
  '4)'에서 입력받은 문자에 따라서, 프로그램을 실행시키기 위해서는 case문을 사용해야 한다.
다음과 같다.

case <변수> in
   "값" )
        <명령어> ;;
   "값" )
        <명령어> ;;
 esac

위와같다.
위 방법을 우리가 목표 하는 것에 적용 시키면.

먼저 메시지를 뿌려 준다.

echo '
   1. 프로세스 리스트 보기
   2. mysql 접속
   3. database 리스트 보기
'
echo -n "번호 선택 : "
read no

case $no in
   "1" )
       
echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
   "2" )
       
mysql -u"root" -p"비밀번호" ;;
   "3" )
       
echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
 esac


위와같이 작성하면, 위 쉘 스크립트를 실행 시키면, 리스트가 나오며 입력 대기 할 것이고, 1,2,3 중 하나의 번호를 누르면 지정 명령어가 실행 될 것이다..
  그렇다면, 다른 문자를 입력하면??  조건에 만족하는 문자가 없으면 그냥 지나간다...



6) 실행이 끝나면 다시 메뉴 보여주기
  명령어를 실행 시키고 빠져 나가 버리면, 다른 메뉴를 선택하기 위해서 또 명령어를 실행시켜야 한다. 하나의 명령어 실행 시키고 다시 메뉴 리스트를 반복적으로 보여 주기 위해서는 이전 강좌에서 배웠던, while 문을 사용하여 계속 실행 시키도록 해 보자.

while ( true ) ; do
  <프로그램>
done

위와같은 문법을 우리 스크립트에 적용하면,

while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
'
   echo -n "번호 선택 : "
   read no

  
case $no in
     "1" )
         
echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
     "2" )
         
mysql -u"root" -p"비밀번호" ;;
     "3" )
         
echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
   esac
done


이렇게 하면, 선택한 명령어 실행이 끝나면, 다시 메뉴를 보여 줄 것이다.
clear 명령어는 화면의 내용을 지우라는 명령어이다. 메뉴가 줄줄줄~~ 내러 가는 일을 방지하기 위함니다.




7) 이 반복 메뉴에서 빠져 나오려면??
  한 명령어 실행이 끝나면, 메뉴가 나올 것이다. Ctrl + C 키를 눌러 빠져 나올 수 있지만, 그건 좀 아닌 것 같은데... 하나의 항목을 추가 했다. 메뉴에서 'q'키를 누르면 빠져 나오게 한다.



while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
    q. 끝내기
'
   echo -n "번호 선택 : "
   read no

  
case $no in
     "1" )
         
echo "show processlist;" | mysql -u"root" -p"비밀번호" ;;
     "2" )
         
mysql -u"root" -p"비밀번호" ;;
     "3" )
         
echo "show databases;" | mysql -u"root" -p"비밀번호" ;;
     "q" )
          exit 0 ;;

   esac
done


위 쉘스크립트에서 'q'키를 누르면 exit 명령어를 실행시켜 빠져 나오게 된다. 물론 정상 종료이기 때문에 0을 리턴한다..




8) "비밀번호"가 바뀌면 다 고쳐 줘야 하나요??
  비밀번호가 바뀌면 위 스크립트에서 "비밀번호" 부분을 모두 수정해야 한다. vi 등의 에디터에 치환 기능이 있어 한번에 치환 한다면 문제가 없다. 하지만, 비밀번호가 'mysql' 이라면, 얘기는 달라진다,.. 명령어인 'mysql'이 함께 바뀌기 때문에.. 하나 하나 수작업으로 고쳐야 한다.
  변수라는 개념을 써서 이 부분을 해결 해 보자.

a="변수"
echo $a

이렇게 하면 출력값은 ? 

변수

위와같이 출력된다. 변수라는 개념을 우리의 쉘스크립트에 적용시키면?

mysqlpw="비밀번호"

while ( true ) ; do
   clean
   echo '
    1. 프로세스 리스트 보기
    2. mysql 접속
    3. database 리스트 보기
    q. 끝내기
'
   echo -n "번호 선택 : "
   read no

  
case $no in
     "1" )
         
echo "show processlist;" | mysql -u"root" -p"$mysqlpw" ;;
     "2" )
         
mysql -u"root" -p"$mysqlpw" ;;
     "3" )
         
echo "show databases;" | mysql -u"root" -p"$mysqlpw" ;;
     "q" )
          exit 0 ;;

   esac
done

위와 같이 보라색 부분을 수정했다. 이렇게 수정하면, 상단의 변수만 수정 하면 다른 부분은 수정할 필요없이 적용되는 것이다.



우리는 이것으로
 쉘 스크립트의 case문과, 변수, 키보드로부터 입력받기 를 알게 되었다.
여러가지 편리한 기능들을 넣어 둔다면, 나만의 관리툴로 만들 수 있을 것이다. [뿌듯]

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 ex5  (0) 2011.05.14
쉘스크립트 Ex4  (0) 2011.05.14
쉘스크립트 example  (0) 2011.05.14
egrep , awk  (0) 2011.05.14
YUM 사용법  (0) 2011.05.13
  리눅스 시스템을 관리하다 보면, 쉘 스크립트의 필요성을 절실히 느끼게 된다. 저자는 쉘프로그램관련 강좌(bash, awk, sed)를 쓰고 싶었다. bash문법, awk문법, sed사용법을 묶은 강좌를 만들고 싶었다.. 하지만, 이것은 나를 위한 정리일 뿐이다. 내가 정리하여 강좌를 쓴다면, 읽는 사람들은 필요하지도 않은 문법을 머리속에 넣어야 하고, 그 조합으로 실무에 적용시키기위해서 수 없이 많은 노력을 할 것이다. 이런 강좌는 필요하지 않다. 정리는 man 페이지를 보면 자세하게 나와 있다. 저자는 리눅스 시스템 관리에 자주 사용되는 쉘 스크립트를 경험담을 담아  강좌를 써 보려고 한다. 최대한 간단하게 만들어서 누구든 쉽게 써 보고 이해하기 쉽게 쉘스크립트를 만들고, 설명하려 할 것이다.

   처음 시작할 쉘 스크립트는 '아파치 자동 재시작 스크립트'이다.
서버를 계속해서 모니터링 해야 한다거나, 특정 수치를 초과 했을 때 조치를 해 줘야 하는 경우가 발생한다.  물론 그 문제점이 일어나지 않게 원인을 파악하여 처리하는 것이 가장 좋지만, 그럴 만한 시간이 없다면, 자동으로 실행되는 쉘 스크립트를 만들어서 띄워 두면 된다.

  금번 강좌에서 아파치 프로세스가 특정 수치만큼 생성 되었을 때, 아파치를 자동 재 시작 해주는 쉘 스크립트를 만들어 보도록 하겠다.

먼저, 어떤일을 할 것인지 생각 해 보자...


1) 아파치 프로세스 수를 어떻게 알지??
   기본적으로 아파치 프로세스 이름은 'httpd'이다 물론 다른 이름을 수 있다. 이 프로세스가 얼마나 떠 있는지 조사하려면?
ps
명령어가 떠 오를 것이다.
 그리고 httpd 프로세스만 잡아서  갯수를 세려면?
grep 명령어와 wc 명령어가 필요하다.

  이런 3명령어를 조합해서 결과를 만들어 보자.

  ps -e  : 현재 서버에서 실행중인 모든 프로세스들을 보여준다.

  ps -e | grep -w httpd : 현재 서버에서 실행중인 프로세스 중 httpd 문자가 포함된 프로세스만 잡아 보여준다.
    '-w' 옵션은 단어 단위 검색이다. httpds 이런 이름이 있어도 포함시키지 않겠다는 의미이다.

  ps -e | grep -w httpd |wc -l: 위에서 잡은 결과의 줄 수를 세어 준다.
  이렇게 하면 프로세스 수를 구할 수 있다.

 위 명령을 단순화 시키려면,
 pgrep -x httpd | wc -l : 'pgrep'은 프로세스이름에서 단어가 포함된 프로세스들의 pid를 얻기 위한 명령이다.
  '-x' 옵션은 'grep'의 '-w'옵션처럼 단어 단위로 검색하기 위한 옵션이다.
 


 2) 아파치를 재시작하는 방법?
  아파치 서버를 운영한다면, 이 방법은 알고 있을 것이다.
  컴파일 설치 했다면, /usr/local/apache/bin/apachectl restart
  또 다른 방법은 apachectl stop, apachectl start 등의 방법이 있으며,
  다른 방법은 아파치 프로세스를 모두 죽이고 시작하는 방법이 있을 것이다.
 pgrep -x httpd | xargs kill -9
 여기서 pgrep은 위에서 설명했고, xargs라는 명령이 뭘까?
 xargs는 표준 입력으로 받은 내용을 xargs의 인자로 기술하는 명령어(kill -9)의  인자로 넣는 명령어이다.
다음 예를 보자.

pgrep -x httpd
5598
5843

실행결과가 위와 같다면, 5598과 5843은 httpd의 PID임을 알수 있다.
위 프로세스를 모두 죽이기 위해서는

kill -9 5598
kill -9 5843

이런 명령을 내려야 하며, 100개라면 100번? 물론 killall 이라는 좋은 명령어가 있지만, 잘 죽지 않을 때는 kill 명령으로 죽여야 한다.


위와 같은 일을 쉽게 해 줄 수 있는 명령이 xargs 이다.
pgrep -x httpd  | xargs kill -9
이렇게 하면,
pgrep -x httpd 의 결과인 5598, 5843 이 자동 kill -9 명령어 뒤에 붙어 실행 되는 것이다.
이 명령어 하나면, 프로세스가 1000개라도 상관 없다^^



3) 자동으로 실행 시켜 주는 반복 작업 시작..
  만약 문제가 있는 시스템이라면, 시스템 관리자는 '1)'의 명령을 내려 프로세스를 수를 확인하고, 생각했던 수치 보다 많으면 '2)'번 명령어를 내려서 아파치를 재 시작 할 것이다. 언제 발생할지도 모르는 것 때문에 지속적으로 보고 있을 수 없고, 자리를 비울 수 도 없다.

bash 쉘에서는 반복작업을 위해서 여러가지 제어문을 제공한다.
지금 사용할 문법은 while 문이다.

 while ( 조건 ) ; do
  <문장>
 done

위 '조건'이 만족하는한  '<문장>'은 계속 실행된다.

 while ( true ) ; do
   ls
 done

위와같이 입력한다면, 계속.. 'ls'명령어를 실행 시킬 것이다.
대부분의 언어에서 그렇듯 반복문에서 빠져 나올려면, 'break' 문법이 있다.

 while ( true ) ; do
   ls
   break
 done


  4) 반복 실행하여 프로세스가 특정 수치 이상이면 아파치 재 시작
우리의 목적한 일을 할 수 있는 쉘 프로그램을 만들어 보자.

while ( true ) ; do
  if [ "`pgrep -x httpd | wc -l`" -ge "500" ] ; then
    /usr/local/apache/bin/apachectl restart
  fi   
done

이렇게 작성하면 끝!!!
  if 문은 조건을 비교하여 조건이 맞으면 then 이하의 문장을 실행한다. 문법은 다음과 같다.

  if [ 조건 ] ; then
    <문장>
  fi
 
 '조건'을 비교하기 위해서 '-ge' 를 썼다. ge(greater than or equal)이다. 크거나 같다의 의미.. 그렇다면,
 gt(크다), le(작거나 같다), lt(작다), eq(같다) 등이 있을 것이라 예상할 수 있다.


  5) 문제점 발견!!
  위 쉘 스크립트를 돌려 두니.. 너무 자주 비교해서, 쉘스크립트가 서버에 부하를 준다..
 그렇다면, sleep으로 비교 시간을 늘려 준다.

while ( true ) ; do
  if [ "`pgrep -x httpd | wc -l`" -ge "500" ] ; then
    /usr/local/apache/bin/apachectl restart
  fi   
  sleep 1
done

위와같이 'sleep 1'을 입력하였다면, 1초가 쉬어라는 것이다. 1초간 쉬었다가 다시 비교하게 된다.



우리는 이것으로 원하는 결과를 얻었다.!
이젠 지속적으로 프로세스를 수를 확인하여 아파치를 재 시작해야 하는 노가다는 하지 않아도 된다. 하하하!!



  이것으로 ' 실무에서 자주 사용되는 쉘 스크립트  #1' 강좌를 마무리 하겠습니다.
본 강좌의 설명이 어렵거나, 잘못된 부분이 있으면 언제든지 따끔한 지적을 바랍니다.

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 Ex4  (0) 2011.05.14
쉘스크립트 Example2  (0) 2011.05.14
egrep , awk  (0) 2011.05.14
YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03

egrep

■ egrep 메타문자 요약

 

한 개의 문자에 매치시키기 위한 아이템

.

임의의 한 문자에 매치됨

ex) egrep?'2005.01.05'?file

2005, 임의의 한 글자, 01, 임의의 한 글자, 05에 매치

<2005/01/05, 2005-01-05, 2005.01.05>

[...]

문자클래스

열거된 임의의 문자에 대응됨

ex) egrep?'gr[ea]y'?file

g, r, e(or)a, y에 매치 <grey, gray>

[^...]

부정형 문자클래스

열거되지 않은 임의의 문자에 매치

ex) egrep?'pu[^t]'?file

p, u 뒤에 t가 오지 않는 행만 매치

\char

이스케이프 처리된 문자

char이 메타문제이거나 이스케이프 처리된 내용에 별도의 특별한 의미가 없다면 char문자에 매치 또는 새로운 메타문자를 정의함

ex) egrep?'\$[0-9]+'?file

행의 마지막을 의미하는 $의 의미를 그냥 돈의 단위인 $로 매치시킴 <$40>

 

뒤에 붙어서 '숫자를 세는' 역할을 하는 아이템

?

물음표

한번 나올 수 있지만 없어도 됨

ex) egrep?'html?'?file

h, t, m 뒤에 l이 나올 수도 있고 나오지 않아도 되는 행에 매치 <html, htm>

*

별표

반복회수에 제한이 없으며 아예 없어도 됨

ex)

egrep?-i?'<hr(?+size?*=?*[0-9]+)??*>?file

?이 한번이 나와도 되고 아니면 나오지 않아도 됨 즉 <hr size = 14 > (or) <hr size=14> 등의 스크립트에 매치

+

플러스

적어도 하나 있어야 되며 숫자에 제한이 없음

ex) 

egrep?-i?'<hr(?+size?*=?*[0-9]+)??*>?file

?이 한번 이상 나오는 경우에 적용됨 즉 htm 스크립트에서는 절대로 hrsize라고 붙여쓰지 않음을 말함 또, [0-9]는 숫자 하나에 대응하지만 숫자가 하나이상 나올 수 있음을 의미

min,max

주어진 범위

최소값과 최대값 사이에서 회수가 제한됨

 

위치에 매치되는 아이템

^

캐럿

행 시작되는 위치에 매치됨

ex) egrep?'^cat'?file

c, a, t으로 시작하는 행만 매치

$

달러

행 끝나는 위치에 매치됨

ex) egrep?'cat$'?file

c, a, t으로 끝나는 행만 매치

\<

단어 앞경계

단어의 시작 위치에 매치됨

ex) egrep?'\<cat'?file

c, a, t으로 시작하는 단어만 매치

\>

단어 뒤경계

단어의 끝 위치에 매치됨

ex) egrep?'cat\>'?file

c, a, t으로 끝나는 단어만 매치

 

기타

|

선택(or)

"|"로 분리되는 표현식 중 하나에 매치됨

ex) egrep?-i?'^(from|to)'?file

f, r, o, m이나 t, o로 시작하는 행에 매치

(...)

괄호

① 선택의 범위를 제한하거나 ② 수량자가 적용되는 그룹을 지정하거나 ③ 백레퍼런스를 쓸 때 위치를 지정하기 위한 메타 문자

ex) egrep?-i?'^(from|to)'?file

^의 선택범위를 제한하기 위해서 사용됨

\1, \2

백레퍼런스

앞에서 첫 번째, 두 번째,... 등의 괄호 안에서 매치된 텍스트에 매치됨

ex) egrep?-i?'\<([a-z]+)?+\1\>'?file

\1은 ([a-z]+)에 매치 <옆의 예는 중복단어 체크 매치시키는 표현식>



■ 앞의 표를 이해하는데 유의사항

 

  1. 이탤릭체로 적은 것은 egrep의 버전에 따라서 적용을 시킬 수 있는 경우가 있고 없는 경우가 있으니 주의해서 사용하기 바란다.


  2. ?는 공백의 의미를 사용했다. 이해하는데 무리가 없을 것이다.



■ 생각하는 방식을 바꾸자

ex> egrep 'cat' file

cat이라는 말에 매치되는 행을 찾는 것이 아니라 c 다음에 a 다음에 t가 나오는 행과 매치시키는 것이라고 이해하는 것이 정규표현식을 이해하는 첫걸음이다. 그리고 공백문자를 일반적인 a, b라는 문자와 똑같이 취급을 해야 한다. 공백문자는 컴퓨터는 특별한 무언가로 여기지 않는다.



■ 정규표현식은 언어다. 우리가 어떤 언어를 배우던지 자꾸 써보고 연습해 보는 것이 중요하듯이 정규표현식도 마찬가지다. 그래서 다양한 방법으로 표현된 정규표현식을 익히는 것이 중요하다.



■ grep에서 매칭을 진행하기 전에 일반적으로 \n인 줄바꿈 문자를 잘라내고 진행한다. 그래서 vi 편집기에서 찾을 수 있는 \n은 grep 에서는 찾을 수 없다.



■ 어떤 문자가 메타문자인지 아닌지는 정규표현식에서 문자가 있는 위치가 결정한다. 예를 들어서 *는 메타문자이지만 \* 인 경우는 escape된 경우이므로 메타문자가 아니다. 또 ^의 경우는 행의 제일 앞을 뜻하나 [^...] 의 경우에서는 ...에 매치되는 문자를 제외한 모든 문자에 매치시킨다. 한 가지의 예를 더 들어보자. -의 경우는 [a-z] 안에 있을 경우는 범위를 나타내지만 []밖에 있을 때는 그냥 -문자에 대치된다.




■ 지나치게 자세하게 찾으려는 표현식은 실용성을 떨어뜨린다.

  우리가 보통 날짜를 나타날 때 2005/01/05 또는 2005.01.05 또는 2005-01-05으로 나타내는데 그래서 우리는 위의 세 가지의 경우를 매치시키기 위해서 다음과 같은 정규표현식을 사용할 것이다.  ex> egrep '2005[./-]01[./-]05' file  그렇게 한다면 우리는 정확히 위의 세 가지 표현에 정확히 매치시킬 수 있지만 다소 타이핑의 수가 많아지게 된다. 그래서 우리는 다음과 같은 차선책을 택할 수 있다. ex> egrep '2005.01.05' file  경제적으로 찾을 수 있다. 하지만 이 표현식의 경우는 다음과 같은 위험이 따른다. 만약 2005901?05345 라는 일정한 배열의 숫자가 있다면 이 행도 찾는 결과를 가져온다. 따라서 우리는 경우에 따라서 정확성과 경제성 사이에서 적절하게 선택을 할 필요가 있다.



■ 위의 표현식이 모든 프로그램이나 편집기에 적용된다는 생각은 하지 말도록 부탁한다. 다른 프로그램에서는 좀 더 복잡한 형태로 정의된다. 다른 프로그램에서 정규표현식을 사용할 경우는 반드시 실험적으로 사용하고 난 뒤에 사용하거나 reference를 참고해서 사용해야 한다.



■ 문자클래스[]는 정규표현식 언어와 전혀 상관없이 별도의 메타문자를 사용



■ 이스케이프 처리되는 경우는 다음의 세 가지의 경우로 나눌 수 있다.


  1.  뒤에 메타문자를 사용하면 그 문자 자체가 가지는 형태로 매치된다. 예를 들어서 \* 라고 쓰면 스크립트 상에 있는  * 에 매치된다.


  2.  뒤에 메타문자가 아닌 문자를 쓰면 언어(language)에 따라서 다른 의미를 가지는 메타문자가 된다. 예를 들어 \< 이면 단어의 시작을 의미하는 메타문자가 된다.


  3.  뒤에 일반적인 문자가 오면  의 의미는 없는 것으로 치부해도 된다. 하지만 \1 , 의 경우는 백레퍼런스로 사용된다.



awk

■ awk란

  ? awk는 두 가지 측면을 가지고 있다. 하나는 단순한 Text 편집기로서의 측면과 좀 더 복잡한 연산을 수행하는 프로그램의 측면으로 나눌 수 있다. awk 하나만 잘 해도 웬만한 정도의 C program을 대신할 수 있을 정도의 힘을 가질 수 있다. (C program과 문법이 비슷하다.) 본론으로 들어가기 앞서는 왜 awk가 의미하는 것이 무언인지 알아야 하지 않을까. awk 는 Aho, Weinberger, and Kernighan 이 세 분의 initial을 따서 이름한 것이다. 그럼 본론으로 들어가서......



■ awk 둘러보기

  ? 다음은 예제 파일들이다.

    (파일명 : exe4.txt)

    

  gold     1    1986  USA                 American Eagle

  gold     1    1908  Austria-Hungary     Franz Josef 100 Korona

  silver  10    1981  USA                 ingot

  gold     1    1984  Switzerland         ingot

  gold     1    1979  RSA                 Krugerrand

  gold     0.5  1981  RSA                 Krugerrand

  gold     0.1  1986  PRC                 Panda

  silver   1    1986  USA                 Liberty dollar

  gold     0.25 1986  USA                 Liberty 5-dollar piece

  silver   0.5  1986  USA                 Liberty 50-cent piece

  silver   1    1987  USA                 Constitution dollar

  gold     0.25 1987  USA                 Constitution 5-dollar piece

    (파일명 : exe5.txt)

    

12;466;125;567;0.435

35;366;454;422;0.4565

35;36;45;42;0.45

34;45;235;236;0.454

567;55;233;446;0.56

34;0.53

    ex1) awk '/gold/' exe4.txt

      gold라는 문자를 가진 행을 출력한다.

    ex2) awk '/gold/ {print $5,$6,$7,$8}' exe4.txt

      gold라는 문자를 가진 행중에서 5, 6, 7, 8 열 만 출력해 준다.




    ex3) awk '{if ($3 < 1980) print $3, "    ",$5,$6,$7,$8}' exe4.txt

      3번째 열이 1980보다 작은 행중에서 3, 5, 6, 7, 8열만 출력해 준다. (간격을 ??     ?? 벌려서 만큼 출력한다.

    ex4) awk '/gold/ {ounce+=$2 END print "sum = "ounce}' exe4.txt

      gold라는 문자를 가진 행에서 두 번째 열을 더한 값을 ounce에 저장해서 그 값을 sum = 과 함께 화면에 출력을 해 준다.



■ awk 문법


  1. TEXT 편집문으로서의 awk문법

     

문법 : awk [-F<ch>] (pgm] | -f <pgm_file> [<vars>] [- | <data_file>]

ch : field separator character (필드 구분 문자)

pgm : awk command-line program (awk 명령문)

pdm_file : file containing an awk program (awk program이 있는 파일)

vars : awk variable initialization (awk 변수 초기화)

data file : input data file (입력하는 파일)


  2. PROGRAM으로서의 awk 문법

     

#!/bin/awk

BEGIN

<search pattern 1>

<search pattern 2>

<awk program syntax>

END




■ 검색 패턴 (search pattern)

  

/The/

The를 포함하는 행을 찾아준다.

/^The/

첫 글자가 T로 시작하는 것 중에서 다음 문자가 he가 나오는 행을 찾아준다

/The$/

T h e로 끝나는 문자가 있는 행을 찾아준다.

/$/

$가 있는 모든 행을 찾아준다

/[Tt]he/

The 나 the가 있는 행을 모두 찾아준다.

/[a-z]/

a부터 z까지 한 문자가 있는 행을 찾아준다

/[a-zA-Z0-9]/

다 알죠??

/wh./

wh와 그 다음의 임의의 한 문자와 대응한다.(why, who wh2 등등)

/^[+-]?[0-9]+$/

+or -를 가지고 있거나 없는 거나(++ -- +-는 매치되지 않음) 그 다음은 숫자가 하나이상 나오는 것인데 단어가 숫자로 끝나는 것에 매치한다.

/(^Korea)|(^China)

Korea 나 China에 매치된다.



■ 내부변수

  

FILENAME

현재 입력한 파일명

FS

필드 구분자 (초기값 0)

NF

필드의 개수

NR

현재 파일의 행 번호

OFS 

output의 field separator

$0

전체 입력 파일의 필드



■ 유용한 명령들

  ex1) awk -F ";" '{print NR,$1,$2,$3,$4,$5}' exe5.txt

    필드 구분 연산자를 공백에서 ;로 바꾸어 줌으로써 awk를 연산하고 있다.

  ex2) awk '{if (NR >2) print $0}' exe5.txt

    행 수가 3이상인 행만 출력한다.




  ex3) awk '{if (NF >2) print $0}' exe5.txt

    열 수가 3이상인 행만 출력한다.

  ex4) awk '{if (length($0) >10) print FILENAME,$0}' exe5.txt

    행의 단어 수가 11이상인 행만 출력한다.

  ex5) awk '{if (length($0) >10) printf("line %2d is %5.3f %6.2f %5.3f, %5.3f %5.4f ", NR, $1,$2,$3,$4,$5)}' exe5.txt

    printf 문의 형태가 C program과 일치하는 것을 알 수 있다. 우리는 쉽게 파일에 나오는 수들의 자리 수들을 쉽게 조절할 수 있다.

  ex6) awk '{print system(ls),FILENAME,$0}' exe5.txt

    system()은 UNIX 명령문을 처리하게 해 준다. 그리고 그 처리한 결과가 정상적으로 실행이 되었다면 그 결과로써 0을 리턴해 준다. 만약 실패하였다면 다른 값을 줄 것이다.

  ex7) awk '{print toupper($1), $2, $3}' exe4.txt

    toupper()은 괄호 안에 있는 문자를 대문자로 변환을 시켜서 출력을 시켜준다.

  ex8) awk 'print {tolower($1), $2, $3}' exe4.txt

    toupper()은 괄호 안에 있는 문자를 소문자로 변환을 시켜서 출력을 시켜준다.

  ex9) awk -F ";" '{print sqrt($1), $2, $3}' exe5.txt

    $1을 제곱근 해 준 값이 출력된다. sqrt뿐만 아니라 다음의 함수들도 존재한다. 효과적으로 이용하시길... atan2(y,x) : 아크 탄젠트 y/x를 출력, cos(x), sin(x), exp(x), log(x), int(x)

  ex10) awk '/silver/ {++x END print x}' exe4.txt

    silver와 일치하는 패턴의 줄 수를 구해 주는 것이다. 이것과 똑같은 결과를 얻기 위한 명령으로는 grep ??silver?? exe4.txt | wc -l 이 있다.

  ex11) awk '$1~/silver/ {print $0}' exe4.txt

    $1에서 silver에 매치되는 행들만 출력해준다. 이 명령은 좀 더 유연한 명령을 실행시켜 명령의 완성도를 높인다고 볼 수 있다.

  ex12) awk '{gsub("from","to");print}' exe2.txt

    from을 to로 모두 치환해서 화면에 출력해 준다.

  ex13) awk -F";" '{if(($1>30) &&($2>100)) print $0}' exe5.txt

    첫 번째 열이 30보다 크고 그리고 두 번째 열이 100보다 큰 것을 출력해준다.





■ awk 프로그램 예제


  1. 합계 구하기

    #!/bin/awk

    #파일명 : sum.awk

    #첫 번째와 두 번째 열을 읽어 들여서 각각의 산술평균을 구하는 awk 프로그램

    #사용법 : awk -f sum.awk filename

     

 

BEGIN 

x_sum = 0;

y_sum = 0;

print "Xcen_image";

print "Ycen_image";

 

x_sum +=$1;

y_sum +=$2;

n++

x_average = x_sum/n ;

y_average = y_sum/n ;

 

END print "x_sum :" x_sum ;

printf("%d ", x_average);

 

print "y_sum :" y_sum;

print "y_average :" y_average;

 


  2. 중복되는 행 출력하지 않게 하기

    #!/bin/awk

    #파일명 : uniq.awk

    #첫 번째 열이 같은 행은 출력하지 않고 첫 번째 열이 다른 것이 나오는 행을 출력한다.

    #사용법 : awk -f uniq.awk filename

     

BEGIN  FS = " "

 

if (var != $1 && NR != 1)

print line

var = $1

line = $0

 

END print line



  3. 첫 번째 열을 인자로 사용하는 배열을 사용하여 같은 인자를 가지는 배열일 경우에는 그 합을 구해주기

    #!/bin/awk

    #파일명 : array.awk

    #사용법 : awk -f array.awk filename

     

 

BEGIN  FS=";"

OFS=":"

      

    total[$1] += $2;

        if( lastcategory != $1)

    printf("lastcategory != $1 ");

            print $1;

            lastcategory = $1

        printf( "       ");

        print $1,$2;

      

END     printf(" "); print "TOTALS";

        for(category in total)

 

                printf("        ");

                print category, total[category];

 


이의 사항이 있거나 질문이 있으시면 이곳으로 이메일을 보내주세요 Webmaster

Copyright ⓒ 2005 All Rights Reserved by Hahn Yi

[출처] [리눅스 awk] awk|작성자 holyruby

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 Example2  (0) 2011.05.14
쉘스크립트 example  (0) 2011.05.14
YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23



Yum은 지정된 서버주소로부터 업데이트된 패키지들을 검사하여 다운로드하고 설치까지 처리해주는 텍스트 기반의 업데이트 프로그램입니다. 또한 의존성 문제도 같이 검사하여 관련 패키지들을 자동으로 설치해주기 때문에 이전에 다소 불편하던 RPM 기반의 프로그램 설치 및 업데이트를 대폭 개선한 패키지 관리자입니다.


1. 설정 확인

yum 업데이트를 위해서는 업데이트 서버의 URL와 기타 세부적인 설정사항들을 확인해야 합니다. yum 동작에 필요한 설정은 /etc/yum.conf 파일에 기록되어 있으므로, 텍스트 편집기 등을 통해 yum 설정내용을 확인합니다.

[main]
retries = 20
removepackages = 0
tolerant = 1
cachedir = /var/cache/yum/
exactarch = 1
pkgpolicy = newest
distroverpkg = Haansoft-release
debuglevel = 2
logfile = /var/log/yum.log


[base]
name=Haansoft Linux 2006 Workstation - Base
baseurl= http://community.haansoftlinux.com
/pub/haansoftlinux/OS/2006/Workstation/RPMS

[updates-released]
name=Haansoft Linux 2006 Workstation - Update
baseurl= http://community.haansoftlinux.com
/pub/haansoftlinux/UPDATE/2006/Workstation/RPMS


[main] 파트에서 yum 동작을 위한 상세한 설정을 할 수 있으며, [base][update-released] 등과 같은 파트를 통해서 업데이트 서버의 주소를 지정하게 됩니다.

※ 참고
주요 항목에 대한 설명은 아래와 같습니다.

항목 내용
cachedir 업데이트를 위해 다운받은 패키지들을 임시로 저장하는 경로
logfile 업데이트 내역을 기록하는 로그 파일의 위치
name 업데이트 서버들을 구별하는 명칭
baseurl 업데이트 서버의 주소 및 경로를 지정


 


2. 업데이트

위와 같이 설정사항에 이상이 없다면 바로 업데이트 명령을 통해 패키지를 업데이트 할 수 있습니다.

[root@localhost ~] # yum update

위의 명령을 입력하면 설정파일에 있는 경로를 참고하여 업데이트 서버에 접속한 뒤, 현재 시스템의 패키지들과 업데이트 서버의 패키지들을 비교하여 최신의 패키지를 모두 업데이트 하게 됩니다. 위의 명령은 손쉽게 모든 패키지들을 업데이트 할 수 있기에 가장 많이 사용되는 업데이트 방법입니다. 만일 특정한 패키지들만 업데이트 하고자 하는 경우에는 아래와 같이 원하는 패키지를 별도로 지정해 줍니다.

[root@localhost ~] # yum update [package_name1] [package_name2]...

패키지를 업데이트하기 전에 업데이트된 패키지가 있는지를 체크하기 위해서는 아래와 같이 체크 옵션을 사용합니다.

[rootlocalhost ~] # yum check-update

단, check-update의 경우 현재 시스템에 설치된 패키지를 기준으로 업데이트 목록을 출력해주기 때문에 업데이트 서버에는 등록되어 있지만 현재 시스템에 설치되지 않은 패키지 목록은 볼 수 없습니다. 이럴 경우 아래와 같이 list 명령을 사용해서 업데이트 서버에 있는 모든 패키지 목록을 확인할 수 있습니다.

[root@localhost ~] # yum list

반대로 현재 시스템에 설치되어 있는 패키지 목록을 확인하기 위해서는 아래와 같은 명령을 입력합니다.

[root@localhost ~] # yum list installed

※ Tip
list가 많아서 한 번에 지나가버려 확인이 어렵다면 아래와 같은 리다이렉션 명령으로 리스트를 파일로 생성한 뒤, 확인할 수 있습니다.

# yum list > server.lst
# vim server.lst


 


3. 신규설치

yum을 이용하면 기존 설치되어 있는 프로그램의 업데이트 뿐만 아니라 시스템에 아직 설치되어 있지 않은 새로운 패키지들도 검사하여 설치가 가능합니다. 앞서 말한 yum list 명령으로 업데이트 서버에 있는 패키지 리스트를 확인한 다음, 설치를 원하는 새로운 패키지가 있다면 install 명령으로 설치를 진행할 수 있습니다.

[root@localhost ~] # yum install package_name

여러 패키지들을 한 번에 설치하기를 원한다면 해당 패키지를 계속해서 적어 줍니다. (install 옵션에서는 기본적으로 하나 이상의 패키지를 지정해야 합니다.)

[root@localhost ~] # yum install package_name1 [package_name2] ...

 


4. 패키지 삭제

yum을 이용하여 패키지를 업데이트하고 신규 설치하는 것 이외에 패키지를 삭제하는 기능도 수행할 수 있습니다.

[root@localhost ~] # yum remove package_name

여러 패키지들을 삭제하고자 한다면, 신규설치의 경우와 같이 삭제 명령 뒤에 해당 패키지를 계속해서 지정해주면 됩니다.


 


5. 기타 기능

업데이트 서버에 등록되어 있는 패키지에 대한 상세한 정보를 보기 위해서는 아래와 같은 명령을 입력합니다.

[root@localhost ~] # yum info package_name

최근에 업데이트한 패키지에 대한 정보는 아래 명령으로 확인합니다.

[root@localhost ~] # yum info updates

※ 참고
패키지명이 중복되는 경우에서의 yum 사용 방법

i386 아키텍처 기반의 시스템이 아닌, x86_64 / PPC / IA64 등과 같은 아키텍처를 사용하는 시스템에서는 아래의 예와 같이 중복된 이름의 패키지가 존재하기도 합니다.
[예] gtk2-2.4.13-18.1AX.i386.rpm / gtk2-2.4.13-18.1AX.x86_64.rpm

이는 x86_64와 같은 시스템에서 i386 아키텍처 기반으로 동작하는 프로그램을 지원하기 위한 패키지들로서 정상적인 동작을 위해서는 위의 2가지 아키텍처가 모두 설치되는 것이 좋습니다.
yum에서는 패키지명을 기준으로 업데이트를 처리하기에 위와 같이 패키지명이 동일하고 아키텍처만 다른 프로그램의 경우, 간혹 하나만 설치되거나 잘 설치되지 않는 경우가 있습니다. 이런 경우에는 아래와 같이 설치 시 아키텍처까지 명시하는 방법으로 모두 설치가 가능합니다.
# yum install gtk2 (일반적인 방법)
# yum install gtk2.i386 gtk2.x86_64 (아키텍처 구분 설치법)

위와 같이 2개 이상의 아키텍처가 존재하는 시스템으로는 아래와 같은 것들이 있습니다.


x86_64 : i386, x86_64
ppc : ppc, ppc64
ia64 : i386, ia64

출처 : http://sdhwang.egloos.com/1022912

'OS > LINUX' 카테고리의 다른 글

쉘스크립트 example  (0) 2011.05.14
egrep , awk  (0) 2011.05.14
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23
/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결  (0) 2011.04.23

VI 명령어 모드 3가지  
1) ESC 모드  
2) 편집모드  
3) ex모드  

ESC 모드에서 사용되는 명령어  
^        :  현재줄의 맨앞  
G        :  화일의 맨끝  
0        :  현재줄의 맨앞  
$        :  현재줄의 맨뒤  
%        :  짝을 이루는 기호 확인하기  
w        :  다음 단어  
b        :  이전 단어  
e        :  현재 단어의 끝 글자  

커서 움직이기  
글자 단위 이동  
k        :    위쪽  
j        :    아래쪽  
h        :    왼쪽  
l        :    오른쪽  
           
             
   줄 단위 이동  

^       :   줄의 맨앞  
0       :   줄의 맨앞  
$       :   줄의 맨뒤  
%       :   짝을 이루는 기호 확인  

+       :   다음줄의 첫번째 글자  
-       :   윗줄의  첫번째 글자  
n|      :   현재줄의 n 번째 열  
H       :   화면상에 처음줄  
nH      :   화면상의 처음줄로부터 n 줄 밑으로  
M       :   화면상의 중간줄  
L       :   화면상의 마지막줄  
nL      :   화면상의 마지막줄로부터 n줄 위로  

G       :   맨 마지막줄  
nG      :   n 번째줄  
gg      :   맨 마지막줄  
ngg     :   n 번째줄  
:n      :   n 번째줄  

단어 단위 이동  
w       :   한단어 오른쪽  
b       :   한단어 왼쪽  
e       :   현재 단어의 끝으로 이동  
E       :   현재 단어의 끝으로 이동 (영문만)  
)       :   다음 문장의 시작  
(       :   이전 문장의 시작  
}       :   다음 문단의 시작  
{       :   이전 문단의 시작  
]]      :   다음 섹션의 시작  
[[      :   이전 섹션의 시작  

화면단위 이동  
z                     커서의 위치와 함께, 화면상의 맨위  
nz                     n번 라인을 화면상의 맨위  
z.                     커서의 위치와 함께, 화면상의 중간  
z-                     커서의 위치와 함께, 화면상의 맨아래  
Control - F(orward)    한화면   밑으로 이동.  
Control - B(ackward)  한화면   위로   이동.  
Control - D(own)      반쪽화면 밑으로 이동.  
Control - U(pon)       반쪽화면 위로   이동.  
Control - E           커서는 현재위치 그대로 화면만 한줄씩  
                                위로   이동  
Control - Y           커서는 현재위치 그대로 화면만 한줄씩  
                                아래로 이동  
Control - G           현재 편집문서의 정보 보여주기  
Control - L           글자가 깨졌을 경우 화면 재표시  
                            (=Control - R)  
     
편집하기  
복사/ 붙이기/ 합치기  
y          복사하기  
yy         한줄복사  (=Y)  
nyy        n줄 복사  
yw         한단어 복사  
y2w        두단어 복사  
yG         문서의 끝까지 복사  
p          붙이기  
np         아래로(오른쪽으로) n번 붙이기  
P          위로(왼쪽으로) 붙이기  
nP         위로(왼쪽으로) n번 붙이기  
J          두줄 합치기  
nJ         n줄 합치기  

지우기/바꾸기/되살리기  
d          지우기  
dd         한줄지우기  
ndd        n줄지우기  
dw         한단어 지우기  
dG         문서 끝까지 지우기  
D          그줄 끝까지 지우기 (=d$ 와 동일)  
c          바꾸기  
cc         한줄바꾸기  
ncc        여러줄 바꾸기 (n 은 임의의숫자)  
cw         한단어 바꾸기  
ce         한단어 바꾸기 (공백 제외)  
C          그줄 끝까지 바꾸기 (=c$ 와 동일)  
r          한글자 바꾸기  
R          바꾸면서 덮어 쓰기  
s          한글자 지우고 insert 모드로 (=cl )  
S          한줄지우고 insert 모드로 (=cc)  
~          대문자 / 소문자 바꾸기 (영문만)  
u          되살리기  

찾기  
/          찾기반복 - 위에서 아래로 (=n)  
?          찾기반복 - 아래에서 위로(=N)  
fn         현재줄에서 한 개의 n문자 찾기  
Fn         현재줄에서 반대방향으로 한 개의 n문자 찾기  
tn         현재줄에서 n문자를 찾아서 앞에 커서놓기  
Tn         현재줄에서 반대방향으로 n문자를 찾아서 뒤에 커서놓기  
;          현재줄에서 한글자 찾기반복  
'          현재줄에서 한글자 찾기반복 (반대방향으로)  

편집모드 지정하기  
i          현재커서위치  
I          현재커서가 위치한 줄의 맨처음에  
a          현재커서위치 바로 다음에  
A          현재커서가 위치한 줄의 맨끝에  
o          현재커서위치 바로 아래줄에  
O          현재커서위치 바로 윗줄에  

ex 명령어  
:n,n1 co n2           n줄 부터 n1줄 까지 n2줄 이후로 복사.  
:n,n1 d               n1줄 부터 n2줄 까지 삭제.  
:.,$ d                현재줄부터 끝까지 지우기  


g 옵션 붙이기  
:g/word            화일전체에서 마지막으로 word이 쓰여진 줄로  
가기  
:g/word/ p         화일전체에서 word이 있는줄 보여주기  
:g/word/ nu        화일전체에서 word이 있는줄을 번호와 함께 보  
여주기  


g 옵션과 바꾸기  
,n s/old/new/g    rn 줄부터 n줄까지 old라는 문자를 new문자로  
                        바꾸면서 확인하기.      :%  
s/old/new/g       처음줄부터 마지막줄까지 old라는 문자를  
                         new문자로 바꾸기  

읽기  

:r filename(=ex /usr/local/test)      현재위치에 filename  
                                     (=ex /usr/local/test)  
                                     읽어들이기  

다중편집하기  
      형식  vi file1 file2 file3  
:args           편집중인 화일목록 보여주기  
:n              다음 화일로 넘어가기  
:prev           이전화일로 돌아가기  


새로운 화일 편집하기  
:e file_name         새로운 file_name 편집하기.                
:e!                  현재의 편집중인 내용을 무시하고 가장  
                    최근에 편집한 내용을 다시편집하기  



저장 및 종료하기  
:w                     저장하기 (write)  
:q                     종료하기 (quit)  
:wq                    저장하고 종료하기  
:x                     저장하고 종료하기 (:wq 와 동일)  
:w!                    강제로 저장하기  
                      (read-only 로 열었을경우)  
:wq!                   강제로 저장하고 종료하기  
:q!                    편집한 내용을 저장하지 않고 종료하기  
:w fillename           새로운 파일이름으로 저장하기  
:w %.new               현재화일 이름에 .new 라는 새로운  
                      확장자로 저장

'OS > LINUX' 카테고리의 다른 글

egrep , awk  (0) 2011.05.14
YUM 사용법  (0) 2011.05.13
GNU screen  (0) 2011.04.23
/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결  (0) 2011.04.23
cut  (0) 2011.04.15

GNU screen

이전위키에 있던 내용을 옮겨왔다.
tmux 도 한번 써보고 싶은데 당장 급해서 일단 screen 쓰다가 옮겨놓은것.


관련링크

외워둘만한명령들

  • 도움말은 C-a ?
  • screen 상태에서 C-a C-d 로 디태치, screen -ls 로 세션들을 확인하고 screen -r 세션이름 을 통해 resume
  • 만약 디태치를 하는것을 깜박하고 장비앞을 떠났다면 screen -d 를 통해서 screen 세션 외부에서 디태치 가능
  • 로깅이 필요하면 C-a H 현 한화면만 잡으려면 C-a h
  • 새 창을 열려면 C-a c 또는 screen 안에서 screen vi 등으로 실행
  • 창간의 전환은 C-a C-a, C-a n, C-a C-p, 등으로 앞뒤로 움직이거나 C-a " 로 리스팅해서 전환 또는 C-a 숫자 로 전환
  • C-a 를 프로세스에 보내려면 C-a a
  • 브레이크를 보내려면 C-a C-b
  • clear 하려면 C-a C
  • 현재 창의 정보는 C-a i
  • 리플레시하려면 C-a l
  • 창을 나누려면 C-a S 나뉜 창간에 포커스 이동은 C-a TAB 현재창만 남기려면 C-a Q 현재창을 닫으려면 C-a X
  • copy 하려면 C-a [ paste 하려면 C-a ] 이쪽은 좀 복잡한 기능들이 많이 붙어있다.
이외에도 존내 많은 기능과 바인딩들이 있다. C-a 때문에 emacs 와 바인딩이 겹치는게 좀 피곤해서 잘 안쓰지만 외부장비에 접속했을경우엔 아주 도움되는 유틸리티.

.screenrc

http://gentoo-wiki.com/TIP_Using_screen 에서 따왔다.

startup_message off
hardstatus alwayslastline                                                                                                                        
hardstatus string '%{gk}[ %{G}%H %{g}][%= %{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{=b C}[ %m/%d %c ]%{W}'

'OS > LINUX' 카테고리의 다른 글

YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결  (0) 2011.04.23
cut  (0) 2011.04.15
xargs  (0) 2011.04.15

/etc/sysconfig/i18n - 시스템의 한글 깨짐 문제 해결

 

시스템를 사용하다보면 한글을 인식하지 못해 한글 깨짐현상이 발생할 수 있는데, 이는 시스템에서 한글설정이 되어 있지 않기 때문이며 제어판 파일을 간단히 설정함으로써 해결할 수 있다.

 

아래 예를 보면서 설명하겠다.

[root@inter-devel yswon]# ll
total 64
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 ftp
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 ftp_log
drwxr-xr-x  2 root  root   4096 Oct 12 17:32 script
-rw-r--r--  1 root  root  13346 Feb  6  2009 temp.txt
drwxr-xr-x  3 yswon yswon  4096 Sep 17  2008 www
drwxr-xr-x  2 yswon yswon  4096 Sep 17  2008 www_log
-rw-r--r--  1 root  root      0 Oct 22 14:23 ????????.txt
[root@inter-devel yswon]#

 

위의 예에서 영문 파일명은 잘 보이지만 한글파일명은 ?등과 같은 깨진 상태로 보인다. 이것은 리눅스 제어판(/etc/sysconfig 디렉토리내에서 설정함)에서 한글코드 설정이 되어있지 않기 때문이다.

 

이 문제는 /etc/sysconfig/i18n 파일의 설정 부분을 변경하면 된다.

현재는 아래와 같이 설정되어 있을 것이다.

LANG="en_us.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"

즉, 보시는 바와 같이 'en_us.UTF-8"로 되어 있으며 영문자만 인식할 수 있다. 

 

따라서 한글을 인식하려면 아래와 같이 설정값을 변경해야 한다.

LANG="ko_KR.eucKR"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"
SYSFONT="latarcyrheb-sun16"

 

즉, LANG행을 "ko_KR.eucKR"로 설정해야 한다.

그리고, 로그아웃한 다음 다시 로그인하게 되면 한글깨짐 문제를 해결할 수 있다.

 

이제 다시 확인해 보면 한글파일명이 제대로 보인다는 것을 알 수 있다.

[root@inter-devel yswon]# ll

합계 64
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 ftp
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 ftp_log
drwxr-xr-x  2 root  root   4096 10월 12 17:32 script
-rw-r--r--  1 root  root  13346  2월  6  2009 temp.txt
drwxr-xr-x  3 yswon yswon  4096  9월 17  2008 www
drwxr-xr-x  2 yswon yswon  4096  9월 17  2008 www_log
-rw-r--r--  1 root  root      0 10월 22 14:23 한글파일.txt
[root@inter-devel yswon]#


'OS > LINUX' 카테고리의 다른 글

YUM 사용법  (0) 2011.05.13
vi 사용하기  (0) 2011.05.03
GNU screen  (0) 2011.04.23
cut  (0) 2011.04.15
xargs  (0) 2011.04.15

+ Recent posts