'awk'에 해당되는 글 1건

  1. 2009.04.15 sed , awk 사용법
OS/Shell Script2009. 4. 15. 16:19
반응형

 

 

sed 명령어
sed는 데이터 편집을 위해 사용화는 프로그램이다. 이는 stream editor를 뜻한다. ed와 다르게 sed는 상호 작용적으로 사용되지 않는다. 그러나, sed 명령은 ed와 매우 비슷하다.
 sed 명령의 일반 형식은

   sed  command  file
이다. 이는 예시된 파일의 각 라인에 적용되는 ed스타일의 명령이다. 만일 예시된 파일이 없다면 표준 입력으로 추정한다. sed는 지시된 명령을 입력의 각 라인에 적용하기 때문에 결과를 표준 출력으로 기록한다.
 이전의 예에서 intro 파일을 살펴보자.

 $ cat intro
 The Unix operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $
 사용자가 "Unix"라는 모든 결과를 "UINX"로 바꾸려 한다고 가정해 보자. 여기서 우리는 sed를 통해 쉽게 할 수 있다.

 $ sed 's/Unix/UNIX/' intro                        substitute Unix with UNIX
 The Unix operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $
이제 한 쌍의 인용 부호 안에 sed명령을 에워싸는 습관을 들이도록 하자. 후에 언제 인용부호가 필요하고 언제 한 쌍의 인용 부호를 쓰는지 배우도록 한다.
 sed 명령 s/unix/UNIX는 intro의 모든 라인에 적용된다. 명령에 의해 바뀌어진 라인인지 아닌지는 표준출력으로 얻는다. sed는 본래의 입력 파일을 바꾸지는 못한다. 바꾸지 못하는 파일을 바꾸기 위해선 sed로부터 일시적 파일로 들어가도록 하여 출력 방향을 변경시키고 intro 파일로부터 뒤의 파일로 옮긴다.

 $ sed  ' s/Unix/UNIX/ '  intro  >  temp      Make the changes And now make them pernanent
 $ mv  temp  intro
 $
 사 용자들은 항상 본래 파일을 고쳐 쓰기 전에 정확하게 변화시킬 파일을 만들어야 한다는 것을 명심해야 한다. temp파일의 cat(파일 내용을 표준 출력으로 출력하는 것) 명령이 sed가 계획한 대로 성공되기를 보증하기 위해서는 위에 보여 준 두 가지 명령 사이에 포함되어야 한다.
 만일 사용자 텍스트가 한 라인에 하나 이상의 "Unix"를 포함하고 있다면 위의 sed명령은 각 라인 위에 첫 번째 발생한 것을 "UNIX"로 변환시켜야 한다. s명령으 끝에 global 옵션 g를 붙임으로써 사용자들은 한 줄 위에 많이 발생하는 문자열이 변환될 것이라 확신하게 된다. 이 경우 sed 명령은 다음을 판독할 것이다.

 $ sed  's/Unix/UNIX/g'  intro  >  temp
 who명령의 출력으로부터 사용자 이름을 추정하기를 원한다고 하자. 이제 여러분들은 cut 명령으로 하는 방법을 이미 알고 있다.

 $ who | cut  -c1-8
 root
 ruth
 steve
 pat
 $
또 다른 방법으로 ed명령에서의 정규식을 사용함으로써 첫 전째 공백에서부터 마지막 라인 끝까지 모든 문자를 삭제하기 위해 sed를 사용할 수 있다.

 $ who  |  sed  's/  .*$//'
 root
 ruth
 steve
 pat
 $
 sed명령은 //와 함께 공백으로부터 마지막 라인(.*$)까지의 임의의 문자들을 치환하라는 것을 뜻한다. 즉 입력된 각 라인의 첫 번 공백에서 시작하여 라인의 끝까지 문자를 삭제한다.

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

 $ sed  -n  '1,2p'  intro                 Just print the first 2 lines
 The UNIX operating system was pioneered by Ken
 Thompson and Dennis Ritchie at Bell Laboratories
 $
 만 약 라인 번호 대신에 슬래시로 에워 싸인 문자열과 함께 p명령이 쓰인다면 sed는 이들 문자들이 포함하고 있는 표준 입력을 통해서 라인들을 프린트하게 된다. 따라서 하나의 파일로부터 처음의 두 라인을 프린트하기 위하여 다음과 같이 사용될 수 있다.

 $ sed  -n  /UNIX/p'  intro              Just print lines containing UNIX
 The UNIX operating system was pioneered by Ken
 The design of the UNIX system was to create an
 $

 라인 삭제
 텍 스트의 모든 라인들을 삭제하기 위해서는 d명령을 사용한다. 라인 번호나 번호의 범위를 예시함으로써 입력에서부터 특수한 라인들을 삭제할 수 있다. 다음 예는 sed가 intro로부터 텍스트의 첫 번 두 라인을 지운 것을 보여 준다.

 $ sed  '1,2d'  intro                     Delete lines 1 and 2
 in the late 1960s. One of the primary goals in
 the design of the Unix system was to create an
 environment that promoted efficient program
 development.
 $

 sed는 디폴트에 의해서 표준 출력을 통해서 입력 받은 모든 라인들 - 즉 세 번째 라인에서 마지막까지 - 은 표준출력으로 단순히 나타내진다.
 텍스트의 문자열에 d명령을 선행시킴으로써 텍스트에 포함된 모든 라인들을 삭제하기 위해 sed를 사용할 수 있다. 다음 예에서 sed가 UNIX란 단어를 포함하는 텍스트 안의 모든 라인들이 삭제하는 것을 보여 준다.

 $ sed  '/UNIX/d'  intro                   Delete all lines containing UNIX
 Thompson and Dennis Ritchie at Bell Laboratories
 in the late 1960s. One of the primary goals in
 environment that promoted efficient program
 development.
 $
 sed 의 힘과 유연성은 여기서 살펴본 것 이상으로 여겨진다. sed는 사용자로 하여금 loop할 수 있고 버퍼에 텍스트를 만들고, 한 개의 편집 문자 안에 많은 명령을 결합할 수 있게 해주는 편리함을 준다. 표 3-2는 sed명령의 몇몇 예를 보여 준다.

sed 명령
내      용
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 명령어
1. Pattern scanning and Processing Utility
 awk command는 비교수행, 산술조작 또는 c-programming feature와 같은 것을 이용하여 주어진 pattern을 text file내에 있는 각 line들의 fields를 scanning하는 command이다.

 SYNTAX
       awk  /pattern/{action} filename(s)
* pattern       character string 또는 match 될 관계 표현식
* action        pattern을 포함하는 각 line의 field를 가지고 수행할 processing을 말한다.
* Filename(s)   awk command로 search할 file(s)

2. Awk pattern
 awk pattern은 정규 표현식, 산술 관계 표현식, 정규와 산술 표현식의 조합을 말한다.

Regular Expression!s (정규 표현식)
 가 장 간단한 정규 표현식은 salsh로 닫혀져 있는 character string을 가르키는데 예를 들어   / george /  georgetown과 같이 george를 포함하고 있는 어떤 line과도 match가 되고 / the /는 the의 앞뒤로 space가 있는 것과 match가 된다. Awk command는 grep command에서 사용되는 많은 regular expression!s를 포함한다.

 regular expression!s는 다음의 것들로 이루어 진다.
    ( )     grouping을 할 때
    [ ]     범위를 지정할 때
    |      or로 사용된다.(pattern field내에서)

&&, || 비교할 때 and 와 or 로 사용된다. ( pattern field내에서)
    +     하나 또는 그 이상
    ?     ZERO 또는 그 이상
    ^     line의 시작
    $     line의 끝
    !     부정
    \     meta-character의 뜻을 인용하여 사용한다.
비교는 주어진 pattern과 field를 비교하는데 $1 - / [Ss]am /은 첫 번째 field가 Sam, sam과 match되는 line을 의미한다.

* Relational Expression!s ( 관계 표현식 )
 관 계 표현식의 set은 두 개의 정규 표현식 ( regular expression!s ) 사이의 관계를 비교 선택 할 때 사용되는데 관계 표현식의 character에는 >,  <,  ==,  <=,  >=,  != 이 있다.

   * Example *
 $1  >=  $2       $3  ==  "s"     $4  !=  2
 $1  ==  "t"  &&  $2  <=  100

* Record와 Field의 지정
 awk command에서 사용되어지는 input은 record와 field로 나누어 지는데 record는 default로 line이고, record의 terminator는 ENTER키이다.
 각 record는 field로 나누어 지며 field의 delimiter는 space 또는 다른 character가 될 수도 있고 각 record는 dollar sign ($)을 이용하여 access가 가능하며 field 1번은 $1, field 2번은 $2,... 로 표현이 가능하다.  Number of record의 variable name은 NR, record variable은 RS, field delimiter는 FS로 표현한다. 아래의 예제는 text file의 내용이 field로 어떻게 나누어 지는지 보여준다.

Field           $1            $2           $3           $4
               ITEM         QUANTITY   PRICE       PARTNO
               x             30            21.40        1234
               y             45            30.00        8888
               z             100           .78          2225

3. Awk action
awk action은 new line 혹은 semicolon (;) 으로 끝나는 statement의 sequence를 말한다. 모든 awk actions은 반드시 brace (  {}  )로 닫혀져야 한다.
{ print  $1,  $2 }
field variables는 비교, change가 가능하다.
{ $1  -  $2  +  $3 ; print $3 }
{ if  ( $3  >  250  ; print $3 )

 

 


   *  Example  *
1. 아래의 예제는 while1이라는 file내의 모든 line을 print한다.
% awk  ' { print }'  while1
2. 아래의 예제는 while1이라는 file내에 "echo"를 포함하는 모든 line을 print한다.
% awk  ' / echo / '  while1
3. 아래의 예제는 /etc/rc* 라는 file내에서 각 line의 첫번째 두번째 field내에 있는 "if"를 포함하는 모든 line을 print한다.
% awk  ' / if /  { print  $1, $2 } '  /etc/rc*
4. 아래의 예제는 /etc/rc* 라는 file내에서 "if"를 포함하는 각 line을 "else if "로 change하여 print한다.
% awk  ' / if /  { $1 = "else if " ;  print } '  /etc/rc*
5. 아래의 예제는 /etc/passwd 라는 file내에서 user-id가 50인 login-name을 print한다.
% awk  -F : ' / 50 /  { if  ( $3 == 50 )  print $1 }'  /etc/passwd
6. line printer daemon에 관련된 PID와 command name을 print한다.
% ps  -ef  | awk  ' / \ / usr \ / lib \ / lpd /  { print $1, $5 } '
7. 아래의 예제는 다섯번째 field가 /usr/lib/lpd가 아니고, record가 awk command를 포함하고 있지 않을 때 line printer daemon에 관련된 PID와 command name을 print한다.
% ps  -ef  | awk  ' / \ / usr \ / lib \ / lpd /  { if  ( $5 != "/usr/lib/lpd " && $0 != "awk " )  print $1, $5 } '

4. Introduction to the Desktop Calculator
 Desktop Calculator ( dc) 는 precidion arithmetic package이고 보통 decimal integer로 operate한다. 그러나 inputbase, outputbase, 소수 부분 등은 따로 지정할 수 있고 dc의 대략적인 structure는 stacking ( reverse Polish ) calculator이다. 만일 argument가 주어진다면 dc package가 끝날 때 까지 주어진 file로부터 input을 가지고 그렇지 않으면 standard input으로부터 input을 가진다.

* Number
stack에 push할 numeric value를 말하며 0에서 9사이의 숫자로 이루어진 string을 말한다. Negative number는 underscore (_)로 구분한다.

* +,  -- ,  / ,  * ,  % ,  ^
stack 상의 두개의 value를 add( + ), subtracted ( -- ) , multiplied ( * ), divided ( / ), reminder ( % ), exponentiated ( ^ )를 할 수 있고 pop 된 두개의 entries는 stack에서 사라지고 계산결과만 stack상에 남는다. exponent의 소수 부분(fractional part)는 무시된다.


* s%
%라는 이름의 register에 어떤 값을 store시키거나 pop할 수 있다. %는 어떤 character라도 가능하며 s가 대문자로 사용되어지면 %는 stack과 같이 다루어지며 어떤 값을 push할 수 있다.

* l%
stack 상에 push된 register 값 %를 가르키며 register %는 고칠 수 없다. 모든 register는 zero value로 시작하고 만일 l이 대문자로 사용되어지면 register %는 stack과 같이 다루어지고 그것의 top value는 main stack상에서 pop되어진다.

* d
stack의 top value가 중복됨을 뜻한다.

* p
stack의 top value를 print한다. 대문자 P는 stack의 top value를 ASCII string처럼 번역하여 print 하고 remove시킨다.

* f
stack의 모든 value와 register를 print한다.

* q
program에서 exit한다.
<!-- sqlca.sqlcode : 0 -->
반응형

'OS > Shell Script' 카테고리의 다른 글

쉘 반복 스크립트  (0) 2010.04.28
IO 리다이렉션 csh VS sh  (0) 2007.03.28
Posted by [PineTree]