'Unix/Linux'에 해당되는 글 16건

  1. 2010.01.13 [Script]sed 사용법
  2. 2010.01.13 [Script]awk의 사용법
  3. 2010.01.13 [Script]awk 및 sed 사용법
  4. 2009.02.11 DOS모드의 파일을 UNIX 모드로 일괄 변경하기
  5. 2009.01.16 nohup 명령어에 대한 모든 것
  6. 2009.01.14 uname 명령을 이용한 시스템 정보 확인 - Kernel 실행 Bit, Version ..
2010. 1. 13. 10:52

[Script]sed 사용법


sed 스트림 편집기
  ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다.
  sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 화일을 수정할 수 있게 하는 반면 ed처럼 대화식처리는 불가능하다. sed 명령어는 1개 라인씩 입력 라인을 읽어들여 표준 출력에 출력한다.
  sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다.
  일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은 수정되지 않고 그대로 출력된다.
  이 sed 명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고 , 수정하고, 출력하기 때문에 기억장치 안의 버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 화일의 크기에 제한 없이 작업을 할 수 있다.
  ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 화일은 처리할 수 없으며 대개 버퍼의 크기는 1MB정도이다. 따라서 sed는 아주 큰 화일을 처리할 때 주로 사용된다.
  sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다.
     # sed "s/hello/goodbye" in.file
  위의 명령어는 in.file이라는 화일에 있는 각 라인에서 첫번째 등장하는 hello라는 문자열을 goodbye로 교체한 후 그 라인을 표준 출력에 출력한다.
     # echo "1234hello5678" | sed "s/hello/goodbye/"
  대치 명령어를 따옴표로 둘러싸야 올바로 사용할 수 있다. 여기서 문자열은 정규식으로 표현될수 도 있다. 그외에도 sed명령어에는 여러 가지 연산자를 사용할 수 있다. 다음의 명령어를 사용하면 hello라는 문자열을 포함하고 있는 모든 문자열을 삭제할 수 있다.
     # sed "/hello/d" in.file
  위 명령어의 의미는 "hello라는 문자열을 포함하고 있는 라인을 찾아 그 라인을 삭제하라"는 것이다.

이 sed 명령어는 다음 명령어와 같은 의미이다.
     # grep -v hello in.file


  라인을 전부 삭제하지 않고 hello라는 문자열만을 삭제하려면 다음 명령어를 사용하다.
     # sed "s/hello//" in.file
  ed와 같이 sed에서도 화일의 일부만을 대상으로 작업하는 경우는 라인의 범위를 지정할 수 있다.
     # sed "3,7s/hello//" in.file
  위의 명령어는 in.file이라는 화일의 라인3에서 7까지만을 대상으로 첫번째 hello를 삭제하고 화일의 그 외의 부분은 변경시키지 않는다. 또한 다음과 같이 사용하면 라인 번호 대신 문맥을 범위로 지정할 수 있다.
     # sed "/hello/,/goodbye/s/bad/good/g" in.file
  위의 명령어는 hello라는 단어를 포함하고 있는 첫번째 라인부터 goodbye라는 단어를 포함하고 있는 라인까지 검색하면서 bad라는 문자열을 모두 good으로 변경한다.
  또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치 작업은 반복된다.
  sed명령어의 기능은 지금까지 우리가 살펴본 것보다 더 강력하다.
  sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 파일에 기억시켜 놓고 사용할 수도 있다.
     # sed -f command.file in.file
  여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 화일이 유용하게 사용된다.
  예를 들어 다음과 같은복수 개의 명령어가 화일에 기억되어 있는 경우는
     # vi command.file
       s/hello/goodbye/
       s/good/bad/
  다음과 같은 명령어를 입력하면
     # echo "1234hello5678" | sed -f command.file
  다음과 같이 출력된다.
     # echo "1234hello5678" | sed -f command.file
       1234badbye5678
  
o sed 기본
     # sed '' ljs --> cat ljs 와 동일

o sed 편집 명령어
      일상적인 sed 명령
    ---------------------------------------------------------------------------------------
     a      다음 라인(들)을 적용될 라인들에 부가한다  (라인뒤)
     c      적용될 라인들을 다음 라인(들)로 변경한다  (라인 대체)
     d      적용될 라인들을 삭제한다
     g      단지 첫번째의 것만이 아니라 라인의 모든 부합 패턴 대체가 적용 되게 한다 
     i       다음 라인(들)을 적용될 라인들 위에 삽입한다  (라인앞)
     p      - n 옵션하에 있을지라도, 라인을 프린트한다
     q       명시된 라인에 도달할 때 중지한다
     r filename  filename을 판독한다. 내용을 출력에 부가한다
     s/old/new/  "old"를 "new"로 대체한다
     =           라인 번호를 프린트한다
     !command    라인이 선택되지 않는 경우 command를 적용한다.
    --------------------------------------------------------------------------------------

o 라인 명시
  sed명령은 두가지 방법을 사용한다. 첫 번째는 번지를 번호로 명시하는것이다.
  여러분은 특정한 라인을 가리키기 위해 단일 번호를 사용할 수 있다.
 # sed '3d' ljs  --> 세번째 라인을 삭제
  또는, 라인들의 범위를 가리키기 위해 콤마(,)로 분리된 두 번호들을 사용할 수 있다.
 # sed '2,4 s/e/#/' ljs  --> 대체 명령은 단지 2-4 라인들에만 적용된다. (단순 대체 명령은 라인에서 첫번째 어커런스에만 적용된다는 점을 기억하라. 따라서 각 적용 라인의 첫 번째 e만이 #로 대체된다)
 # sed -n '/kingdom/p' ljs  --> kingdom이 들어있는 line만 프린트
 # sed '/kingdom/p' ljs  --> 모든 line이 나타나고 그와 동시에 kingdom line이 중복해서 나타남
 # sed '[Pp]rincess/d' ljs  --> princess 또는 Princess를 포함하고 있는 라인들을 삭제함
 # sed '1,/fragrant/d' ljs  --> 라인 1로부터 fragrant를 포함하고 있는 첫번째 라인까지의 모든 라인들을 삭제함
o sed 명령 하이라이트
     # more ljs
       I am a boy
       You are a girk
       He is a doctor
     # sed 'a\
       Hey !' ljs  --> 각 라인뒤에다 Hey la la!를 입력
        I am a boy
        Hey !
        You are a girk
        Hey !
        He is a doctor
        Hey ! 

     # sed 'a\
       Oh! good\  --> 을 사용함으로써 하나 이상의 라인들을 부가할 수 있다
       yeh' ljs
     # sed '3a\
       Good Morning' ljs  --> 3 line뒤에다 내용 삽입
     # sed 'c\
       Oh marvelous delight! sing to me! ' ljs  --> 기존의 라인들을 이것으로 대체시킴
       Oh marvelous delight! sing to me!
       Oh marvelous delight! sing to me!
       Oh marvelous delight! sing to me!
     # sed '2q' ljs  = sed 2q ljs --> q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤
                                      중지하게 한다. 즉 2라인만 보여줌
     # sed -n '1s/a/#/gp' ljs  --> 전체적으로 바꿔줌

o sed의 패턴-부합
      패턴-부합에 대한 sed메타 문자
     -------------------------------------------------------------------
       메타 문자            작    용
     -------------------------------------------------------------------
       \             다음 문자의 특수한 의미를 부정한다
       ^              라인의 시작과 부합한다
       $              라인의 끝과 부합한다
       .              어떠한 단일 문자와도 부합한다
       [ ]            둘러싸인 문자들 중의 어느 하나와 부합한다
       [^...]         ...리스트에 없는 어떠한 문자와도 부합한다
       pat*           0 또는 그 이상의 pat 어커런스들과 부합한다
                      여기에서 pat는 단일문자 또는 [ ]패턴이다
       &              s 명령의 newpattern부분에서 사용되어 oldpattern
                      부분의 재 산출을 나타낸다
     -------------------------------------------------------------------

o 간략한 예--------------------------------------------
    명 령         결  과
  -----------------------------------------------------
   /Second/       Second를 포함하고 있는 어떠한 라인과도 부합한다.
   /^Second/      Second로 시작하는 어떠한 라인과도 부합한다.
   /^$/          공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다.
                  이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가
                  문자이기 때문이다.
   /c.t/          cat, cot, 기타 등을 포함하고 있는 라인들과 부합한다. 이 패턴은 단어의
                  일부일 수 있음에 유의하라. 예를 들어, apricot와 acute도 부합된다.
   /./            적어도 한 문자를 포함하고 있는 라인들과 부합한다.
   /\./           피리어드를 포함하고 있는 라인들과 부합한다. 는 .의 특수한 의미를 부정
   /s[oa]p/       sop또는 sap와는 부합하지만 sip 또는 sup와는 부합하지 않는다.
   /s[ ^oa]p/     sip또는 sup와는 부합하지만 sop또는 sap와는 부합하지 않는다.
   s/cow/s&s/     cow를 scows로 대체한다.
   /co*t/         * --> 어떠한 수
  ----------------------------------------------------------------------------------------

o 간단한 sed 해법
     # sed '/^$/d' ljs  --> 모든 공백 라인 제거
     # sed '/^ *$/d' --> space로 만들어진 공백까지 제거 (조심! ^와 *사이에 공백이 있어야 한다)
     # sed 'a\
       ' ljs   --> 각 line마다 공백라인 추가
     # sed '/^#/d' ljs  --> 첫번째 열에 #을 가진 라인 제거
     # sed 's/^/     /' ljs  --> 각 line의 시작을 5 space로 대체

o 다중 명령
     # sed 's/Bob/Robert/g
            s/Pat/Patricia/g' ljs  --> sh을 사용하는 경우에는 을 생략하라
     # sed 's/cat/dog/g
            s/dog/pigs/g' ljs  --> 먼저 모든 cats를 dogs로 변환한 다음에 모든 dogs를 pigs로 변환한다.
     # sed 's/Bob/Robert/g
            s/Pat[^a-z]/Patricia/g' ljs  --> ^a-z은 a에서 z까지의 문자들이 아닌 모든 문자를
                                             의미한다는 점을 상기하라

o 태그
  위에서 Pat!와 같은 것이 발견될때 !를 포함한 전체 문자열이 Patricia로 대체되므로 !가 소실된다.
  우리는 !를 유지하면서 Pat를 대체하는 방법을 필요로 한다. 우리는 이것을 태그(tag)를 사용하여
  수행할 수 있다. 패턴의 일부를 "태그"하려면, 그것을 좌측에는 (로 우측에는 )로 둘러싸라.
  그 다음에, 명령의 newpattern부분에서, 여러분은 그렇게 둘러싸인 패턴의 첫 번째 것은 1로,
  두번째 것은 2 등으로 인용할 수 있다. 이 방법을 사용하면 다음의 명령이 부여된다.
      # sed 's/(Pat)([^a-z])/1ricia2/g' ljs
o 쉘 스크립트와 sed
      # vi twospace
        sed 'a\
        ' $*   --> $*은 모든 인자들을 나타냄
      # twospace ljs | pr | lpr
   위 예는 sed가 어떻게 하여 UNIX 프로그래밍과 쉘 스크립트에 적합한가를 나타낸다.

출처 : Tong - 굿보이군님의 Linux통

옵션
d - 라인을 지우기
p - 라인을 출력
r - 파일을 읽음
s - 다른 문자를 읽음

sed -n '/west/p' data.file - grep과 같은 라인 출력
sed -n '3,5p' /opt/data.file - 3에서 5번줄까지 출력
sed -n '/Chris/,$p' data.file - data.file 안에 Chris부터 끝까지 출력
sed 's/3/X/' data.file - data.file 안에 3을 X로 변환(라인당 하나만 변환)
sed 's/3/X/g' data.file - data.file 안에 3을 모두 X로 변환
sed -n '/(tab)[0-9]$/p' data.file - 파일안에 tab이후에 0-9가 들어가고 줄끝문자가 이어지는 라인만 출력
sed -n '/(tab)[0-9]$/& HITE/p' data.file - 파일안에 조건에 맞는 라인에 끝에 HITE라는 문자 추가(여기서의 $는 ~부터 끝까지가 아닌 줄끝 문자의 의미를 가진다)
sed '/west/d' data.file - 파일안에 west를 빼고 출력
sed '/May/,/TJ/d' data.file - 파일안에 May부터 TJ까지 빼고 출력
sed '/west/r /opt/mess' data.file - 파일안에 west가 들어가는 라인에 mess란 파일 데이터를 읽어드려 추가

cat > 1.sed
1,4d - 1,4를 지움
s/north/North/ - north를 찾아 North로 변경
s/^east/East/ - east로 시작하는 라인을 찾아 East로 변경
sed -f 1.sed data.file - 파일안에 라인을 1.sed에 따라 연속처리
-n 옵션에 대해 - -n 옵션이 들어가면 라인출력인 p가 붙어야 화면에 출력한다. 반대로 -n이 없을 경우 p가 붙지 않아도 출력하며 p가 있을 경우 두번 출력해 주는 형식이 된다.
[출처] http://blog.naver.com/siyang6?Redirect=Log&logNo=30021355074

2010. 1. 13. 10:46

[Script]awk의 사용법

awk.. grep과 더불어 아주 유용한 툴입니다. ^^

출처 : 다음카페 오라닉스

1. awk란?
awk란 일종의 프로그래밍 언어이지만 주로 패턴 검색과 조작시에 주로 사용된다. 이 툴의 어원은
프로그램을 개발한 Alfred Aho, Peter Weinberger, Brian Kernigham의 머리글자를 따서 명명되어
졌다.

2. awk 이용하기
(1) 설명: awk는 단독으로 이용되기 보다는 다른 프로그램들과 연계해서 이용되는 경우가 대부분이
          다.
(2) 연결해서 이용되는 경우
   1) grep명령으로 넘어온 데이터들의 값을 처리하는 경우
   2) sed로 정규화된 양식을 처리하는 경우

3. awk 사용법
(1) 사용법
   awk [options] 'pattern{action}' filename
(2) options
   -F 필드구분자 : 필드구분자를 지정할 때 사용한다. 기본 필드구분자는 공백이다.
   -f 파일명: 스크립트파일을 불러온다.
(3) pattern
   BEGIN: 입력화일을 읽어들이기 전에 제시되는 문자를 실행시킬 때 지정한다.
   END: awk가 모든 입력을 처리한 후, 옆에 제시되는 문자를 실행시키도록 할 때 지정한다.
   /문자열/: 문자열과 일치하는 라인을 찾아 action을 실행한다.
(4) action
   print : 제시된 표현식을 표준출력한다.

4. awk 사용예
(1) [posein@www posein]$ awk '/posein/ {print}' /etc/passwd
     posein:x:500:500::/home/posein:/bin/bash
(2) [posein@www posein]$ cat result.dat
     영어 85점
     수학 70점
     국어 95점
     컴퓨터 100점
     과학 80점
     [posein@www posein]$ awk '{print $1}' result.dat
     영어
     수학
     국어
     컴퓨터
     과학
      => result.dat파일의 첫번째 필드를 출력한다. 기본 필드의 구분은 공백이다.
(3) [posein@www posein]$ awk 'BEGIN{print"--과목--"} {print $1}' result.dat
     --과목--
     영어
     수학
     국어
     컴퓨터
     과학
      => BEGIN 이라는 패턴에 의해 먼저 '--과목--'이라는 문자열을 출력한 뒤에 첫번째 필드를
       출력한다.
(4) [posein@www posein]$ awk 'BEGIN{print"--점수--"} {print $2}' result.dat
     --점수--
     85점
     70점
     95점
     100점
     80점
(참고) sed를 이용한 내용편집
   1. 설명: sed는 스트림편집기로 텍스트파일의 내용을 필터링하여 출력해준다. -f 옵션은 미리
           지정한 파일안에 스크립트를 입력했을 경우 그 스크립트의 내용을 불러와서 처리해준다.
   2. 사용예
     [posein@www posein]$ cat sedscr
     s/점$//
      => 맨 끝의 점을 공백으로 바꾸라는 스크립트파일이다.
     [posein@www posein]$ sed -f sedscr result.dat
     영어 85
     수학 70
     국어 95
     컴퓨터 100
     과학 80
      => 맨 끝의 점이 제거되고 출력된다.
(5) [posein@www posein]$ sed -f sedscr result.dat | awk 'BEGIN{sum=0; print "나의 총점";} \
     {sum += $2} END {print "합계: " sum}'
     나의 총점
     합계: 430
      => 총점을 구하려고 하는데 두번째필드는 점이라는 문자가 들어있어서 연산이 곤란하다. sed를
        이용하여 '점'이라는 문자를 제거해야 연산이 가능하다. BEGIN과 END는 각각 처음과 끝에
        처리하는 패턴을 뜻한다.
(참고) 총점 및 평균 구하는 스크립트파일로 만들기
   [posein@www posein]$ cat sum.awk
   #!/bin/awk
   #
   # This Program is SUM & AVG of result.dat
   #
   # BEGIN: 프로그램 시작 처리
   BEGIN {
      sum=0;
      print "나의 총점 및 평균"
   }
   #ROUTINE: 프로그램 본문
   {
     sum += $2;
   }
   #END: 프로그램 마무리 처리
   END {
     print "합계: " sum;
       avg = sum/5;
     print "평균: " avg;
   }
(6) [posein@www posein]$ sed -f sedscr result.dat | awk -f sum.awk
     나의 총점 및 평균
     합계: 430
     평균: 86
       => -f는 미리 파일로 작성된 스크립트를 불러오는 옵션이다.
(7) [root@www bin]# awk -F: '{print $1}' /etc/passwd
       => /etc/passwd의 필드를 ':'으로 구분하여 첫번째 필드의 값을 출력한다.

[출처] http://blog.naver.com/20cjy00?Redirect=Log&logNo=80002832347

2010. 1. 13. 10:34

[Script]awk 및 sed 사용법

스크립트


--------------------------------------------------------------------------------

기본적인 특수 문자에 대한 설명


  . (dot) 
      개행문자(\n, newline)를 제외한 모든 문자와 매치된다.
      단, awk에서는 라인을 (\n)만 지정하지 않으므로, 개행문자(\n)와도 매치가 된다.


 * (asterisk)
      매치되는 일반문자, 정규식문자의 숫자에 제한을 가지지 않는다( 0 ~ 무한대 ).


 [...] (brackets)
     괄호안에 있는 모든 문자와 일치하는 문자를 찾는다. 예를 들어 [aE] 라고 하면, a 또는 E 문자를 찾는다.
     - (hyphen)을 사용하게 되면, 특정 문자에서 특정 사이의 모든 문자를 가리키게 된다.
     이 괄호에서는 모든 메타문자들이 자신의 기능을 상실하게 된다. 다만 ^ 와 같은 예외의 기능을 가지는 문자들도 있다.
     ^(caret) 는 괄호 내부에서 !(not)의 기능을 가지고 있다. 예를 들어 [^ ] 는 ' '공백문자가 아닌 모든 문자를 가리키게 된다.


 ^ (caret)
     각 라인의 처음을 가리킨다. 이것은 첫번째 문자가 아니라는 걸 명심해야 한다.
     단지 각 라인의 처음이라는 것이다. awk에서는 개행문자의 다음이 아니다.


 $ (dollar)
     각 라인의 끝을 가리킨다. ^(caret)과 마찬가지로 awk에서는 개행문자 이전이 아니다.


 \{n,m\} (middle brackets)
     단일문자, 메타문자가 매치되는 갯수의 영역을 명시한다.
     \{n\} 은 정확하게 n개가 되는 것을 말하며,
     \{n,\} 은 n개 이상,
     \{,m\} 은 m개 이하를 말하며,
     \{n,m\} 은 n개 이상, m개 이하를 말한다.


 \ (back slash)
     다음에 오는 문자가 특수문자(Special Character)임을 알린다.


--------------------------------------------------------------------------------

< Vi >
Replace

: %s/boy/girl/           // edit mode에서 파일 전체행의 boy라는 글짜를 girl이라는 글짜로 바꾸는 작업.

: 5,10s/boy/girl/g      // 5행에서 10행까지 글짜 바꾸는데, 한줄에 두 번 이상 나와도 바꾸는 옵션 g.

: .,20s/boy/girl/         // 현재행 .에서 20행 까지.

: .,$s/boy/girl/           // 현재행 .에서 마지막 행까지.

: .,/man/s/boy/girl/     // 현재행 .에서 다음의 man 이라는 글짜를 포함하는 행까지.


--------------------------------------------------------------------------------

<  SED - a Stream EDitor     >
  sed   [-e script][-f script-file][file...]

기본적인 기능은 ed에서 따 왔으며, 이 기능들은 모두 sed에 적용이 된다. 다만 ed는 대화형 편집기이며,
sed는 스트리밍 편집기이다. 대화형 편집기와 스트리밍 편집기의 차이점은 대화형 편집기는 입력 및 출력이
하나로 이루어지며, 스트리밍 편집기는 하나의 입력이 하나의 출력을 낸다는 것이다.
\n 을 개행문자로 사용하는 스트리밍 에디터이다. 

 찾기(search), 출력(print),
    sed -n '/abd/p' list.txt   :  list.txt 파일을 한줄씩 읽으면서(-n : 읽은 것을 출력하지 않음)  abd 문자를 찾으면 그 줄을 출력(p)한다.

 치환(substitute),
    sed 's/addrass/address/' list.txt   :  addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 출력을 바꿔서 한다.
     sed 's/addrass/address/' list.txt > list2.txt
     sed 's/\t/\ /'  list.txt            : 탭문자를 엔터로 변환
    sed 's/□□*/□/'  list.txt       : ( *표시: □ 는 공백 문자를 표시한다. ) 위의 구문은 한개이상의 공백문자열을 하나의 공백으로 바꾼다.


 추가(insert)
     scriptfile  -  s/</\ /g
     sed -f scriptfile 1.html  :  < 문자부분에  \n 개행문자를 넣어서 다음줄에 출력하도록 한다.

 삭제(delete)
    sed '/TD/d' 1.html   :  TD 문자가 포함된 줄을 삭제하여 출력한다.
     sed '/Src/!d' 1.html :  Src 문자가 있는 줄만 지우지 않는다.
     sed '1,2d' 1.html    :  처음 1줄, 2줄을 지운다.
    sed '/^$/d   1.html    : 공백라인을 삭제하는 명령이다

  파일 이름만을 뽑아내는 정규식
     s/^.*\/\([a-zA-Z0-9.]*\)".*$/\1/   : ^는 라인의 맨 처음, .* 아무문자열, \(, \)은 정규표현식을 그룹화, $ 는 라인의 맨 끝.
    ( s;^.*\/\([a-zA-Z0-9.]*\)".*$;\1;)    \1는 그룹화된 첫번째 요소를 말한다.
                                                                        [a-zA-Z0-9.] 는 알파벳과 숫자 및 .(콤마)를 표현하는 문자(character)를 말한다.
       즉 GF02.jpg와 같은 문자열을 첫번째 그룹화하고 난 다음 라인 전체를 그룹화된 내용으로 바꾸는 것이다. 
  /g     : global을 의미  한줄에 대상문자가 여러개일 때도 처리하도록 한다.

 who | sed -e 's; .*$;;'    :  각 라인의 첫 번째 공백에서부터 마지막까지 삭제하라.

 who | sed -e 's;^.* ;;'     :  각 라인의 처음부터 맨 마지막 공백까지 삭제하라.

 who | sed -e 's;^.*:;;'     :  각 라인의 처음부터  : 문자가 있는 곳(:문자포함)까지 삭제하라. 

 -n 옵션
 sed는 항상 표준 출력에서 입력 받은 각 라인을 나타낸다는 것을 알아냈다. 그러나 때때로 한 파일로부터 몇 개의 라인들을 추출해 내기 위해 sed를 사용하기를 원할 때도 있다. 이러한 경우에 -n옵션을 사용한다. 이 옵션은 사용자가 만약 해야 할 일을 정확히 말해 주지 않는다면 임의의 라인을 프린트하는 것을 원하지 않는다고 sed에게 말한다. 따라서 p명령이 같이 쓰인다. 라인 번호와 라인 번호의 범위를 나타냄으로써 sed를 사용하여 텍스트의 라인들을 선택적으로 프린트할 수 있게 한다. 다음에서 볼 수 있는 바와 같이, 한 파일로부터 첫 번째 두 라인이 프린트되었다.

 $ sed  -n  '1,2p'  intro                 Just print the first 2 lines from intro file.


만약 라인 번호 대신에 슬래시로 에워 싸인 문자열과 함께 p명령이 쓰인다면 sed는 이들 문자들이 포함하고 있는 표준 입력을 통해서 라인들을 프린트하게 된다. 따라서 하나의 파일로부터 처음의 두 라인을 프린트하기 위하여 다음과 같이 사용될 수 있다.

 $ sed  -n  '/UNIX/p'  intro              Just print lines containing UNIX


   sed  '5d'                                   : 라인 5를 삭제
   sed  '/[Tt]est/d'                        : Test 또는 test를 포함하는 모든 라인들을 삭제
   sed  -n  '20,25p'  text                : text로부터 20에서 25까지의 라인들만 프린트
   sed  '1,10s/unix/UNIX/g'  intro    : intro의 처음 10개의 라인들의 unix를 UNIX로 변경
   sed  '/jan/s/-1/-5'                     : jan을 포함하는 모든 라인들 위의 첫 번째 -1을 -5로 변경
   sed  's/...//'  data                      : 각 data라인으로부터 처음 세 개의 문자들을 삭제
   sed  's/...$//'  data                    : 각 데이터 라인으로부터 마지막 3문자들을 삭제
   sed  -n  '1'  text                        : 비 프린트 문자들을 \nn으로 (여기서 nn은 그 문자의 8진수 값임),
                                                    그리고 탭 문자들을 > 로 나타내는 각 텍스트로부터의 모든 라인들을 프린트
--------------------------------------------------------------------------------


awk 명령어

--------------------------------------------------------------------------------

 awk '/west/'  datafile            :  west 라는 글이 있는 줄 출력

 awk '/^north/' datafile           :  north로 시작하는 줄 출력

 awk '/^(no | so)/' datafile     :  no 또는 so 로 시작하는 줄 출력

 awk '{ print  $3, $2 }'  datafile  : datafile 리스트의 세 번째 와 두 번째 필드를 스페이스로 띄어서 출력

 awk '{ print  $3  $2 }'  datafile  : datafile 리스트의 세 번째 와 두 번째 필드를 그냥 붙여서 출력

 awk '{ print  "Number of fields : " NF} '  datafile  : datafile의 각 줄마다의 필드수를 리턴한다.

 awk '$5 ~ /\.[7-9]+/'  datafile   :  다섯 번째 필드가 마침표 다음엣 7과 9사이 숫자가 하나 이상 나오는 레코드 출력

 awk '$2 !~ /E/ { print $1, $2 }'  datafile  : 두 번째 필드에 E 패턴이 없는 레코드의 첫 번째와 두 번째 필드 출력

 awk '$3 ~  /^Joel/{ print $3 " is a nice guy."} ' datafile  : 세 번째 필드가 Joel로 시작하면 " is a nice guy"와 함께 출력

 awk '$8 ~ /[0-9][0-9]$/ { print $8 }' datafile  : 여덟 번째 필드가 두 개의 숫자이면 그 필드가 출력

 awk '$4 ~ /Chin$/ { print "The price is $" $8 "." }' datafile   : 네 번째 필드가 Chine으로 끝나면 "The price is $" 8번 필드 및 마침표가 출력

 awk -F:  '{ print  $1 } '  datafile     : -F 옵션은 입력 필드를 ':'로 구별.

 awk -F"[ :]" '{ print  $1, $2 } ' datafile   : 입력 필드로  스페이스와 ':'를 필드 구별자로 사용

 awk -f  awk_script.file datafile     :  -f 옵션은 awk 스크립트 파일 사용할 때 씀.

 

 awk '$7 == 5'  datafile        : 7번 필드가 5와 같다면  출력

 awk '$2 == "CT" { print $1, $2 }' datafile    : 2번 필드가 "CT" 문자와 같으면 1, 2 번 필드 출력

 awk '$7 <  5  { print $4, $7}' datafile         : 7번 필드가 5보다 작다면  4번, 7번 필드 출력

 awk '$6 > .9 { print $1, $6}' datafile          : 6번 필드가 .9 보다 크다면  1번, 6번 출력

 awk '$8 > 10 && $8  < 17 ' datafile   

 awk '$2 == "NW" || $1 ~ /south/ { print $1, $2 }' datafile

 

 

 

 

 재지향 출력/입력

     파일 기술자 0 : 표준 입력
     파일 기술자 1 : 표준 출력
     파일 기술자 2 : 표준 에러 출력
     $ kill -1 1234 > killout.txt  2>&1     :  killout.txt에  표준 출력과 에러출력을 같이 하겠다는 의미.
     $ kill -1 1234  1>&2                      :  표준출력을 에러출력으로 하겠다는 의미.

 

 

gcc 컴파일 ( make 파일 )


--------------------------------------------------------------------------------

1. 의존성

     all  :  myapp myapp.1        // 여러 파일을 만들려면 가짜 대상인 all을 사용한다.

     myapp : main.o 2.o 3.o

     main.o : main.c a.h

     2.o : 2.c a.h b.h

     3.o : 3.c b.h c.h

2. 규칙

     all  :  myapp myapp.1       // 아무런 대상 명시 없이 make를 실행하면 기본행동으로  all에 있는 것을 생성한다.

     myapp : main.o 2.o 3.o

            gcc -o myapp main.o 2.o 3.o

     main.o : main.c a.h

            gcc -c main.c

     2.o : 2.c a.h b.h

            gcc -c 2.c

     3.o : 3.c b.h c.h

            gcc -c 3.c

3. 매크로

    매크로 정의 형식 :   MACRO_NAME=value

    사용 형식           :    $(MACRO_NAME) or  ${MACRO_NAME}

        CC=gcc

        INCLUDE=.

        CFLAGS=-g -Wall -ansi

        all  :  myapp myapp.1      

        myapp : main.o 2.o 3.o

            $(CC) -o myapp main.o 2.o 3.o

        main.o : main.c a.h

            $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c

        2.o : 2.c a.h b.h

            $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c

        3.o : 3.c b.h c.h

            $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

4. Clean & Install

        INSTDIR=/usr/local/bin

        clean  :                             // 어떤 의존성도 없으므로 적을 것이 없다.

             -rm main.o 2.o 3.o       // make 명령은 -로 시작하는 명령의 결과를 무시한다. 그래서 make clean은 무조건 성공했다고 간주한다.

        install  :  myapp                // install을 위한 명령을 수행하기 전에  myapp를 먼저 생성해야 한다는 것을 의미

        @if [ -d $(INSTDIR) ]; \    // @로 시작되는 줄은 표준 출력하지 않는다.

                then \

                cp myapp $(INSTDIR); \

                chmod a+x $(INSTDIR)/myapp; \

                chmod og-w $(INSTDIR)/myapp; \

                echo "Installed in $(INSTDIR)"; \

          else \

                echo "Sorry, $(INSTDIR) does not exist"; \

          fi

5. 내장(Built-in) 규칙

        make는 내부에 기본 규칙을 매크로를 사용하여 가지고 있다.

        OUTPUT_OPTION = -o $@           //  $@  현재 대상의 완전한 이름

        COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

        .c.o :                     // c로 끝나는 파일로부터 o로 끝나는 파일을 만든다는 규칙.

             $(COMPILE.c) $< $(OUTPUT_OPTION)

6. 접미사 규칙

     형식 : .< 소스접미사>.<결과접미사>:

        all : myapp

        .SUFFIXES : .cpp

        .cpp.o :                 // cpp 파일로부터 오브젝트 파일 만들어내는 규칙. (유닉스는 c++파일에 대해 cpp가 아닌 cc로 끝내는 것이 관례)

             $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<      // -xc++은 gcc에게 소스파일이 C++ 파일임을 말해줌.

                                                                                    //  $< 는 시작하는 파일명 즉 소스 파일명으로 확장되는데,

                                                                                    //                    의존하고 있는 대상보다 최신의 파일 하나.

                                                                                    //  $?  의존하고 있는 현재 대상 중 최신의 것들

                                                                                    //  $*  접미사를 제외한 대상 파일의 이름.

 출처 : http://ai.korea.ac.kr/~kaizer/unix/scripts.htm

2009. 2. 11. 16:39

DOS모드의 파일을 UNIX 모드로 일괄 변경하기

 

[root@ihelpers cv]# cat dos2unix

#/bin/sh

find ../html -name "*.php3" -print -exec perl -p -i -e "s/^M//g" {} \;
find ../html -name "*.php" -print -exec perl -p -i -e "s/^M//g" {} \;
find ../html -name "*.html" -print -exec perl -p -i -e "s/^M//g" {} \;
find ../html -name "*.htm" -print -exec perl -p -i -e "s/^M//g" {} \;

^M 문자열은 CTRL+V+ENTER 로 입력한다.

[root@ihelpers cv]# ./dos2unix

...

출처 : http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=7&KEY=&SC=S&&CC=&PAGE=1&IDX=584

2009. 1. 16. 09:07

nohup 명령어에 대한 모든 것

:: 명령의 정지나 로그아웃에 영향을 받지 않는 명령으로 유닉스 시스템의
접두부(다른명령의 앞에 오는 명령)명령의 하나이다.
따라서 해당 명령을 지속적으로 실행하고자 할때 사용된다.

[syntax]

nohup 명령어 &


[예제]

$ nohup sleep 400 & <== 명령실행
[1] 7026
$ Sending output to nohup.out <== nohup의 표준출력파일이 생성된다.

이제 로그아웃해본다.
ctrl + d
$ There are running jobs. <== 작업이 있다고 알려준다.그래도 로그아웃한다.
ctrl + d

다시 로그인 한다.
$ ps -ef| grep user6
user6 7026 1 0 15:52:03 ? 0:00 sleep 400 <== 실행중이군여..
user6 7049 7029 14 15:53:00 pts/tg 0:00 ps -ef
user6 6769 6768 0 14:12:12 pts/tc 0:00 -sh
user6 7050 7029 3 15:53:00 pts/tg 0:00 grep user6
user6 7029 7028 0 15:52:38 pts/tg 0:00 -sh
$

[Tip]

:: nohup 명령의 출력방향을 지정하지 않으면 Default로 nohup.out이라는 파일이
생성된다. 이파일에는 표준출력과 표준에러가 모두 기록된다.

[참고] http://cafe.daum.net/itcome/FJLr/238?docid=h1oj|FJLr|238|20080919184010&q=nohup&srchid=CCBh1oj|FJLr|238|20080919184010
2009. 1. 14. 17:27

uname 명령을 이용한 시스템 정보 확인 - Kernel 실행 Bit, Version ..




# uname 또는 uname -s =kernel 실행 bit, KERN_POINTERS "IRIX64"

# uname -n = Hostname "irix"

# uname -r = operating system release "6.5"

# uname -R = hardware specific release "6.5 6.5.30m"

# uname -v = OS 설치 시간 "mmddhhmm" 형식 출력 "07202013"

# uname -m = machine hardware "IP30"

# uname -a = -mnrsv 옵션을 모두 사용 "IRIX64 irix 6.5 07202013 IP30"