ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • sed와 awk 사용법
    Linux/Command 2018. 3. 26. 03:54

    텍스트 조작

     완전한 기능을 갖춘 대화형 텍스트 편집기를 꺼내들지 않고서는 텍스트 파일에 있는 텍스트를 빨리 조작하고 싶을 때가 있다. 이럴 때 텍스트 요소에 대해 서식화, 삽입, 변경, 삭제를 자동으로 할 수 있는 간단한 커맨드라인 편집기가 있다면 유용할 것이다. 

     리눅스 시스템은 이러한 일을 위해 널리 쓰이는 두 가지 도구를 제공하는데, 가장 인기 있는 커맨드라인 편집기인 sed와 gawk를 설명한다.



    sed 편집기 배우기

    sed편집기는 일반적인 대화형 텍스트 편집기와는 반대 개념인 스트림 편집기다. vim과 같은 대화형 텍스트 펴집기에서는 데이터에 있는 텍스트의 삽입, 삭제 또는 바꾸기 작업을 키보드를 사용한 상호작용으로 처리한다. 스트림 편집기는 데이터를 처리하기 전에 미리 제공 받은 일련의 규칙에 따라 데이터의 스트림을 편집한다.

    1. 입력 수단으로부터 한 번에 하나씩 데이터를 줄을 읽어 들인다.

    2. 제공된 편집기 명령으로 데이터를 대조한다.

    3. 명령에서 지정된 대로 스트림의 데이터를 바꾼다.

    4. STDOUT으로 새로운 데이터를 출력한다.

    스트림 편집기가 한 줄의 데이터를 모든 명령과 대조하고 나면 다음 줄을 읽어 들이고, 프로세스를 되풀이한다. 스트림편집기는 데이터 스트림의 모든 줄을 처리하고 난 뒤 종료한다. 커맨드라인에서 차례대로 한 줄씩 읽어 들이므로 편집할 데이터 스트림은 sed 편집기를 한 번씩만 통과한다. 그 덕택에 sed 편집기는 대화형 편집기보다 훨씬 빠르고 파일을 그때그때 빠르게 바꿀 수 있다.

    sed options script file


    sed 명령 옵션

     옵션 

    설명 

     -e script 

    입력을 처리하는 동안 실행 중인 명령에 스크립트에 지정된 명령을 추가한다. 

     -f file 

    입력을 처리하는 동안 실행 중인 명령에 파일에 지정된 명령을 추가한다. 

     -n

    각 명령에 대한 출력을 만들어 내지는 않지만 print 명령을 기다린다. 


     script 매개변수는 스트림 데이터에 적용할 단일한 명령을 지정한다. 하나 이상의 명령이 필요하다면 -e 옵션으로 커맨드라인으로 지정하거나 -f 옵션을 별도의 파일에 지정해야 한다. 


    커맨드라인에서 편집기 명령 정의하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 이 예는 sed 편집기의 s 명령을 사용한다. s 명령은 슬래시 사이에 지정된 첫 번째 텍스트 문자열을 두 번째 텍스트 문자열로 바꾼다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ echo "This is a test" | sed 's/test/big test/'
    This is a big test
     
     
    # sed 명령은 실행과 동시에 거의 즉시 데이터를 돌려준다. 데이터의 각 줄을 처리할 때마다 결과가 표시된다. 
    # sed 편집기가 전체 파일의 처리를 처리하기 전에 결과를 보기 시작할 것이다. 
    # sed 편집기는 텍스트 파일 자체의 데이터를 바꾸지 않는다는 점이 중요하다. 단지 STDOUT에 변경된 텍스트를 보낼 뿐이다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat data1.txt
    The quick brown fox jumps over the lazy dog.
    The quick brown fox jumps over the lazy dog.
    The quick brown fox jumps over the lazy dog.
    The quick brown fox jumps over the lazy dog.
    The quick brown fox jumps over the lazy dog.
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed 's/dog/cat/' data1.txt
    The quick brown fox jumps over the lazy cat.
    The quick brown fox jumps over the lazy cat.
    The quick brown fox jumps over the lazy cat.
    The quick brown fox jumps over the lazy cat.
    The quick brown fox jumps over the lazy cat.
    cs


    커맨드라인에서 여러 편집 명령 사용하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # sed 커맨드라인에서 하나 이상의 명령을 실행하려면 -e 옵션을 사용한다.
    # 명령은 세미콜론으로 분해야 하며 명령과 세미콜론의 끝 사이에 빈 칸이 있으면 안 된다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed -'s/brown/green/; s/dog/cat/' data1.txt
    The quick green fox jumps over the lazy cat.
    The quick green fox jumps over the lazy cat.
    The quick green fox jumps over the lazy cat.
    The quick green fox jumps over the lazy cat.
    The quick green fox jumps over the lazy cat.
     
    # 명령을 구분하기 위해 세미클론을 사용하는 대신 bash 쉘에서 보조 프롬프트를 사용할 수도 있다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed -'
    > s/brown/green/
    > s/fox/elephant/
    > s/dog/cat/' data1.txt
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
     
    # 명령을 마무리하는 그 줄에 닫는 홀따옴표가 나와야 한다는 것을 꼭 기억하자.
    cs


    파일에서 편집기 명령을 읽기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # sed 명령이 많이 있다면 별도의 파일에 저장하는 것이 더 쉬울 때가 많다. 이러한 파일을 정하기 위해 -f 옵션을 사용한다.
    # 혼란을 막기위해 sed 스크립트 파일에는 .sed파일 확장자를 사용한다. 
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat script1.sed
    s/brown/green/
    s/fox/elephant/
    s/dog/cat/
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed -f script1.sed data1.txt
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.
    The quick green elephant jumps over the lazy cat.

    cs



    gawk 프로그램 배우기

     sed편집기는 즉석에서 텍스트 파일을 수정하기 위한 편리한 도구지만 한계가 있다. 파일의 데이터를 수정하고 재구성할 수 있는 좀 더 프로그래밍에 가까운 환경을 제공하는 고급 데이터 조작 도구가 gawk다. gawk 프로그램은 원래 유닉스에 있던 awk 프로그램의 GNU 버전이다. gawk 프로그램은 프로그래밍 언어를 제공함으로써 스트림 편집을 한다.

    - 데이터를 저장하는 변수 정의

    - 데이터를 다룰 수 있도록 산술 및 문자열 연산자 사용

    - if-then 및 루프문과 같이 데이터 처리에 로직을 추가하는 구조적 프로그래밍 개념 ㅏ용

    - 데이터 파일 안에서 데이터 요소를 추출하고 다른 순서 또는 형식으로 재구성하여 형식화 된 보고서 생성


    gawk 명령 형식 살펴보기

    gawk 프로그램의 기본 형식은 다음과 같다. 

    gawk options program file

    gawk 옵션

     옵션 

     설명 

     -F fs

    한 줄에서 데이터 필드의 경계를 식별하기 위한 파일 구분자를 지정한다. 

     -f file 

    프로그램이 읽어 들일 파일 이름을 지정한다.

     -var=value 

    gawk 프로그램에서 사용할 변수의 기본값을 정의한다. 

     -mf N 

    데이터 파일에서 처리할 필드의 최대 수를 지정한다. 

     -mr N 

    데이터 파일의 최대 레코드 크기를 지정한다. 

     -W keywork 

    gawk의 호환성 모드 또는 경고 수준을 지정한다.

    gawk 의 힘은 스트립트 프로그램이다. 텍스트 줄 안에서 데이터를 읽어 들인 다음 조작하고, 어떤 유형의 결과 보고서를 위한 데이터든 만들고 표기할 수 있는 스크립트 작성할 수 있다. 


    커맨드라인에서 프로그램 스크립트 읽기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # gawk프로그램 스크립트는 열고 닫는 괄호로 정의한다. 스크립트 명령은 두 중괄호 ({}) 사이에 있어야 한다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk '(print "Hello World!"}'
    gawk: cmd. line:1: (print "Hello World!"}
    gawk: cmd. line:1:  ^ syntax error
     
    # gawk 커맨드라인은 스크립트를 하나의 텍스트 문자열로 가정하기 때문에 홀따옴표로 스크립트를 묶어야 한다. 
    # 스크립트는 한 개의 명령인 print 명령을 정의한다. 말 그대로 STDOUT에 텍스트를 출력한다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk '{print "Hello World!"}'
     
    # 텍스트를 한 줄 입력하고 <Enter> 키를 누르면 그제서야 스크립트를 통해 텍스트를 처리한다.
    # bash 쉘은 파일 끝(EOF)문자를 만드는 조합 키를 제공한다. <Ctrl> + <D> 키 합은 bash에 EOF 문자를 만들어낸다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk '{print "Hello World!"}'
    Hello World!
    This is test
    Hello World!
    cs


    데이터 필드 변수 사용하기

    gawk의 주요 기능 중 하나는 텍스트 파일 데이터를 조작할 수 있는 능력이다. 자동으로 입력받은 줄의 각 데이터 요소를 변수에 할당함으로써 이러한 능력이 발휘된다. 기본적으로 gawk는 텍스트의 줄 안에서 검출된 각 데이터 필드에 다음 변수를 대입한다.

    - $0 : 텍스트의 전체 줄
    - $1 : 텍스트의 줄에서 첫 번째 데이터 필드

    - $2 : 텍스트의 줄에서 두 번째 데이터 필드

    - $n : 텍스트의 줄에서 n 번째 데이터 필드

    한 줄 안에서 각 데이터 필드는 필드 구분자로 결정된다. gawk가 텍스트 한 줄을 읽을 때 이 줄은 지정된 필드 구분자를 사용해서 각 데이터 필드로 분리한다. 기본 구분자는 화이트스페이스 문자다 (탭이나 빈 칸문자)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 텍스트 한 줄을 읽고 첫 번째 데이터 필드 값만 표시하는 gawk 프로그램 예
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat data2.txt
    One line of text.
    Two lines of test text.
    Three lines of test text.
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk '{print $1}' data2.txt
    One
    Two
    Three
     
    # 다른 필드 구분자를 사용하는 파일을 읽는다면 -F 옵션을 사용하여 구분자를 결정할수 있다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk -":" '{print $1}' /etc/passwd
    root
    daemon
    bin
    sys
    sync
    games
    man
    lp
    mail
    news
    uucp
    proxy
    www-data
    backup
    cs


    프로그램 스크립트에서 여러 명령 사용하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # gawk 프로그램 언어는 여러 가지 명령어를 프로그램에 넣을 수 있다. 
    # 커맨드라인에 지정된 프로그램 스크립트에서 여러 명령을 사용하려면 각 명령 사이에 세미콜론을 넣으면 된다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
    My name is Christine
     
    # $4 필드 변수에 값을 할당한다. 두번째 명령은 전체 데이터 필드를 출력한다. 
    # 프로그램을 실행하면 STDIN을 통해 들어오는 텍스트를 기다린다. 프로그램을 종료하려면 데이터 끝을 알리는 <Ctrl> + <D> 키 조합을 누른다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk '{
    > $4="Cristine"
    > print $0}'
    My name is Rich
    My name is Cristine
    cs


    파일로부터 프로그램 읽기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # sed 편집기와 마찬가지로 파일에 프로그램을 저장하고 커맨드라인에서 참조할 수 있다.
    ajaehwan@DESKTOP-R2MTKGU:~/test$ cat script2.gawk
    {print $1 "'s home directory is " $6}
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk -F: -f script2.gawk /etc/passwd
    root's home directory is /root
    daemon's home directory is /usr/sbin
    bin''s home directory is /bin
     
    # 쉘 스크립트처럼 gawk 프로그램도 변수의 값을 참조할 때 달러 기호를 사용하지 않는 것을 알 수 있다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat script3.gawk
    {
    text = "''s home directory is "
    print $1 text $6
    }
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk -F: -f script3.gawk /etc/passwd
    root's home directory is /root
    daemon's home directory is /usr/sbin
    cs


    데이터를 처리하기 전에 스크립트 실행하기

    gawk 프로그램은 또한 언제 프로그램의 스크립트를 실행할 수 있을지도 지정할 수 있다. 기본적으로 gawk는 입력 스트림을 통해 한 줄의 텍스트를 읽고 그 텍스트 줄의 데이터에 대해 프로그램 스크립트를 실행한다. 때로는 보고서의 머리말 부분을 만들 때처럼 데이터를 처리하기 전에 스크립트를 실행해야할 수도 있다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # BEGIN 키워드는 gawk가 데이터를 읽기 전에 지정된 프로그램 스크립트를 실행하도록 강제한다.
    # 데이터를 읽기 전에 print 명령이 텍스트를 표시한다. 텍스트를 표시한 뒤에 데이터를 기다리지 않고 종료한다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk 'BEGIN {print "Hello World!"}'
    Hello World!
     
    # gawk가 BEGIN 스크립트를 실행 한 뒤 파일 데이터를 처리하기 위해 두번째 스크립트를 사용한다. 
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat data3.txt
    Line 1
    Line 2
    Line 3
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk 'BEGIN {print "The data3 File Contents:"}
    > {print $0}' data3.txt
    The data3 File Contents:
    Line 1
    Line 2
    Line 3
    cs


    데이터를 처리한 후 스크립트 실행하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # END 키워드를 사용하면 gawk가 데이터를 읽은 후에 실행할 프로그램 스크립트를 지정할 수 있다.
    # 파일 내용 출력을 완료하면 END 스크립트 명령이 실행된다. 모든 데이터를 처리한 후 보고서 꼬리말 데이터를 추가하기 좋다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk 'BEGIN {print "The data3 File Contents:"}
    > {print $0}
    > END {print "End of File"}' data3.txt
    The data3 File Contents:
    Line 1
    Line 2
    Line 3
    End of File
     
    # FS라는 특별한 변수를 정의한다. 이는 필드 구분자를 정의한다. 필드 구분자를 정의하는 또 다른 방법이다. 
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat script4.gawk
    BEGIN {
    print "The latest list of users and shells"
    print " UserID \t Shell"
    print "------------ \t -----------"
    FS=":"
    }
     
    {
    print $1 "      \t "    $7
    }
     
    END {
    print "This concludes the listing"
    }
     
    jaehwan@DESKTOP-R2MTKGU:~/test$ gawk -f script4.gawk /etc/passwd
    The latest list of users and shells
     UserID          Shell
    ------------     -----------
    root             /bin/bash
    daemon           /usr/sbin/nologin
    bin              /usr/sbinFS/nologin
    sys              /usr/sbin/nologin
    This concludes the listing
    cs




    sed 편집기 기본 마스터하기

    더 많은 바꾸기 옵션 소개

    한 줄 안에 텍스트를 새로운 텍스트로 바꾸는 s 명령을 사용하는 방법은 앞에서 보았다. 그러나 바꾸기 명령을 쓸 수 있는 몇 가지 추가 옵션은 더욱 일을 쉽게 만든다.


    바꾸기 플래그

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat data4.txt
    This is test of the test script.
    This is the second test of the test script.
     
    # 바꾸기 명령은 여러 줄에 걸친 텍스트를 바꿀 때에는 잘 동작하지만 기본적으로는 각 줄에 처음 나오는 문자열만을 바꾼다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed 's/test/trial/' data4.txt
    This is trial of the test script.
    This is the second trial of the test script.
     
    # 다른 장소에 나오는 문자열에도 적용되게 하려면 바꾸기 명령의 플래그를 사용해야 한다.
    - s/pattern/replacement/flags
        - 숫자 : 몇 번째로  나타나는 패턴을 새로운 텍스트로 바꿀지를 뜻함.
        - g: 기존의 텍스트에서 나타나는 모든 패턴을 바꿔야 한다는 것을 뜻함.
        - p : 원래 줄의 내용이 출력되어야 한다는 것을 뜻함.
        - w file : 바꿀 결과를 파일에 써야 한다는 것을 뜻함.
     
    # sed 편집기가 일치하는 패턴 중에 몇 번째 것을 새로운 텍스트로 바꿀지를 지정
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed 's/test/trial/2' data4.txt
    This is test of the trial script.
    This is the second test of the trial script.
     
    # g 플래그는 모든 텍스트 패턴을 바꾼다.
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed 's/test/trial/g' data4.txt
    This is trial of the trial script.
    This is the second trial of the trial script.
     
    # p 바꾸기 플래그는 일치하는 패턴을 출력하고, -n 플래그는 sed 편집기의 출력을 억제한다. 
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat data5.txt
    This is a test list.
    This is a different line.
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed -'s/test/trial/p' data5.txt
    This is a trial list.
     
    # w 바꾸기 플래그는 같은 출력을 내놓지만 지정된 파일에 출력을 지정한다. 
    jaehwan@DESKTOP-R2MTKGU:~/test$ sed -'s/test/trial/w test.txt' data5.txt
    jaehwan@DESKTOP-R2MTKGU:~/test$ cat test.txt
    This is a trial list.
    cs


    글자 바꾸기

    1
    2
    3
    4
    5
    6
    7
    # 문자열 속에서 바꾸기 패턴을 쉽게 쓸 수 없는 글자를 만날 때가 있는데, 자주 보게 것이 슬래시(/)다.
    # 파일의 경로 이름을 대체할 때에는 곤란할 수 있는데, /etc/password 파일에서 C 쉘을 bash쉘로 바꾸고자 한다면 다음과 같이 해야한다.
    [root@master ~]# sed 's/\/bin\/\bash/\/bin\/\csh/' /etc/passwd
     
    # 슬래시는 문자열 구분자로 사용되기 때문에 패턴 텍스트에 나타나는 경우 이스케이프를 위한 백슬래시를 사용해야 한다.
    # 이 문제를 해결하기 위해 구분자를 다른 문자(!) 느낌표로 변경하여 사용이 가능하다.
    [root@master ~]# sed 's!/bin/bash!/bin/csh!' /etc/passwd
    cs


    주소 사용하기

    sed편집기에서 사용하는 명령은 텍스트 데이터의 모든 줄에 적용된다. 특정 줄 또는 줄의 그룹만 명령을 적용하고 싶다면 줄의 주소를 사용해야 한다. 

    - 숫자 범위로 된 줄

    - 줄을 걸러낼 텍스트 패턴

    두 가지 형태 모두 주소를 지정하기 위한 형식은 같다.

    [address] command

    또한 특정한 주소에 대해서 두 개 이상의 명령을 함께 묶어서 적용할 수 있다.

    address {

    command1

    command2

    command3

    }


    숫자로 줄 주소 지정하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 숫자 줄 주소를 사용하는 경우 텍스트 스트림에서의 줄 위치를 사용하여 줄을 참조한다.
    # 명령에서 지정한 주소는 한 줄의 번호, 또는 시작 줄 번호, 쉼표, 마지막 줄 번호로 지정한 줄의 범위가 도리 수 있다.
    [root@master ~]# sed '2s/dog/cat/' data1.txt
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy cat
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy dog
     
    # 줄의 주소 범위를 사용한 또 다른 예
    [root@master ~]# sed '2,3s/dog/cat/' data1.txt
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy cat
    The quick brown fox jumps over the lazy cat
    The quick brown fox jumps over the lazy dog
     
    # 텍스트 끝까지 가는 줄의 그룹에 명령을 적용하고 싶다면 달러 기호를 쓸 수 있다.
    [root@master ~]# sed '2,$s/dog/cat/' data1.txt
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy cat
    The quick brown fox jumps over the lazy cat
    The quick brown fox jumps over the lazy cat
    cs


    텍스트 패턴 필터 사용하기

    명령이 적용되는 줄을 한정하는 다른 방법은 좀 복잡하다. sed 편집기는 명령을 적용할 줄을 걸러내기 위한 테스트 패턴을 지정한다.

    /pattern/command

    1
    2
    3
    4
    5
    6
    7
    # 지정한 패턴은 슬래시로 감싸야 한다. sed편집기는 사용자가 지정한 텍스트 패턴을 포함하는 줄에만 명령을 적용한다.
    [root@master ~]# grep Samantha /etc/passwd
    Samantha:x:1001:1001::/home/Samantha:/bin/bash
     
    # sed 편집기는 훨씬 복잡한 패턴을 만들 수 있도록 텍스트 패턴에 정규표현식이라는 기능을 사용할 수 있다.
    [root@master ~]# sed '/Samantha/s/bash/csh/g' /etc/passwd
    Samantha:x:1001:1001::/home/Samantha:/bin/csh
    cs


    명령을 그룹화하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 개별 줄에 하나 이상의 명령을 수행해야 하는 경우 중괄호로 명령을 그룹화한다.
    [root@master ~]# sed '2{
    > s/fox/elephant/
    > s/dog/cat/
    > }' data1.txt
    The quick brown fox jumps over the lazy dog
    The quick brown elephant jumps over the lazy cat
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy dog
    cs



    줄 지우기

    텍스트 스트림에서 특정한 텍스트 줄을 지워야 하는 경우에는 삭제 명령을 사용할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # 삭제 명령은 d로 꽤 쉽게 유추할 수 있다. 제공된 줄 주소체계와 일치하는 모든 텍스트 줄을 지운다.
    # 주소 체계를 포함하는 것을 잊어버리면 모든 줄이 스트림에서 삭제되기 때문에 삭제 명령을 쓸 때에는 주의하자.
    [root@master ~]# cat data1.txt
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy dog
    The quick brown fox jumps over the lazy dog
     
    [root@master ~]# sed 'd' data1.txt
     
    # 삭제 명령은 지정된 주소와 함께 사용할 때 가장 유용하다. 이 기능으로 데이터 스트림에서 특정한 줄을 지운다.
    [root@master ~]# sed '3d' data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 4.
    This is line number 5.
     
    [root@master ~]# sed '2,3d' data6.txt
    This is line number 1.
    This is line number 4.
    This is line number 5.
     
    [root@master ~]# sed '2,$d' data6.txt
    This is line number 1.
     
    [root@master ~]# sed '/number 1/d' data6.txt
    This is line number 2.
    This is line number 3.
    This is line number 4.
    This is line number 5.
     
    # sed 편집기는 원본 파일을 건드리지 않는 다는 것을 잊지 말자.
     
    # 두 개의 텍스트 패턴을 사용하며 일정 범위의 줄을 지울 수 있지만 이럴 때에는 주의해야 한다.
    # 지정된 첫 번째 패턴은 줄 삭제 기능을 '켜고', 두 번째 패턴을 줄 삭제 기능을 '끈다'
    [root@master ~]# sed '/1/,/3/d' data6.txt
    This is line number 4.
    This is line number 5.
     
    # 삭제 기능은 첫번째 패턴 일치에서 '켜졌다.' 종료 패턴 일치를 발견하지 못했기 때문에 전체 데이터 스트림이 지워졌다.
    cs



    텍스트 삽입 및 첨부하기

    예상했던 것처럼 다른 편집기와 마찬가지로 sed 편집기는 데이터 스트림에 텍스트 줄을 삽입하고 추가할 수 있다. 

    - 삽입(insert) 명령: 지정된 줄 바로 앞에 새로운 줄 추가

    - 첨부(append) 명령: 지정된 줄 다음에 새로운 줄 추가

    이들 명령은 한 줄의 커맨드라인에서는 쓸 수 없다. 삽입 또는 첨부할 줄은 별개로 다은 줄에 지정해야 한다. 

    sed '[address]command\

    new line'

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    # new line에 있는 텍스트가 편집기 출력에서 사용자가 지정하는 장소에 나타난다. 
    # 삽입 명령을 사용할 때 텍스트가 데이터 스트림 텍스트 앞에 나타난다
    [root@master ~]# echo "Test LIne 2" | sed 'iTest Line 1'
    Test Line 1
    Test LIne 2
     
    # 첨부 명령을 사용할 때 텍스트는 텍스트 데이터 스트림 텍스트 뒤에 나타난다.
    [root@master ~]# echo "Test LIne 2" | sed 'a\Test Line 1'
    Test LIne 2
    Test Line 1
     
    [root@master ~]# echo "Test LIne 2" | sed 'i\
    > Test Line 1'
    Test Line 1
    Test LIne 2'
     
    # 숫자 줄 번호 또는 텍스트 패턴 중 하나로 조건을 지정할 수는 있지만 주소의 범위를 사용할 수 없다. 
    [root@master ~]# sed '3i\This is an inserted line.' data6.txt
    This is line number 1.
    This is line number 2.
    This is an inserted line.
    This is line number 3.
    This is line number 4.
    This is line number 5.
     
    [root@master ~]# sed '3a\This is an inserted line.' data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is an inserted line.
    This is line number 4.
    This is line number 5.
     
    # 데이터의 마지막 줄을 나타내는 달러 기호를 사용하면 된다.
    [root@master ~]# sed '$a\This is an inserted line.' data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is line number 4.
    This is line number 5.
    This is an inserted line.
     
    # 새로운 줄을 추가하려고 할 때에도 같은 개념이다. 
    [root@master ~]# sed '1i\
    > This is one line of new test.\
    > This is another line of new text.' data6.txt
    This is one line of new test.
    This is another line of new text.
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is line number 4.
    This is line number 5.
    cs



    줄 바꾸기

    변경명령을 사용하면 데이터 스트림에서 텍스트 줄의 전체 내용을 바꿀 수 있다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 삽입이나 첨부 방식과 같은 방식으로 동작하고, 나머지 부분과는 별도로 새로운 줄을 지정해야 한다.
    [root@master ~]# sed '3c\
    > This is a changed line of text.' data6.txt
    This is line number 1.
    This is line number 2.
    This is a changed line of text.
    This is line number 4.
    This is line number 5.
    '# 주소에 텍스트 패턴을 사용할 수 있다.
    [root@master ~]# sed '/number 3/c\
    This is a changed line of text.' data6.txt
    This is line number 1.
    This is line number 2.
    This is a changed line of text.
    This is line number 4.
    This is line number 5.
    '# 텍스트 패턴 변경 명령은 데이터 스트림에서 조건에 일치하는 어떤 줄의 텍스트든 바꾼다.
    [root@master ~]# sed '2,3c\
    > This is a new line of text.' data6.txt
    This is line number 1.
    This is a new line of text.
    This is line number 4.
    This is line number 5.
    cs



    문자 변환하기

    변환 (transform) 명령(y)는 한 개의 문자에 대해 실행되는 유일한 sed 편집기 명령이다. 

    [address]y/inchars/outchars/

    변환 명령은 inchars와 outchars 값을 일대일로 대응시킨다. inchars의 첫 번째 문자는 outchars의 첫 번째 문자로 변환된다. 이러한 대응은 지정된 문자의 길이 동안 계속 된다. 길이가 같지 않는 경우 sed 편집기는 오류를 낸다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@master ~]# sed 'y/123/789/' data6.txt
    This is line number 7.
    This is line number 8.
    This is line number 9.
    This is line number 4.
    This is line number 5.
     
    # 출력에서 볼 수 있듯이 inchars 패턴에 지정된 문자의 각 요소는 outchars 패턴의 같은 위치에 있는 문자로 대체되었다.
    # 변환 명령은 전역 명령이다. 어디에서 나타나든 관계없이 텍스트 줄에서 발견되는 모든 문자에 대해  변환을 수행한다.
    [root@master ~]# echo "This 1 is a test of 1 try." | sed 'y/123/456/'
    This 4 is a test of 4 try.
    cs



    출력 다시 살펴보기

    sed 편집기가 변경한 줄을 표시하기 위해 바꾸기 명령에 p 플래그를 사용하는 방법을 보여주었다. 또한 데이터 스트림의 정보를 출력할 수 있는 세 가지 명령을 사용할 수 있다.

    - p 명령: 텍스트 줄을 인쇄

    - 등호(=) 명령: 줄 번호를 출력

    - l (소문자 L) 명령: 줄의 내용을 모두 출력


    줄 인쇄하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # p명령은 편집기의 출력 과정에서 한 줄을 인쇄한다. 
    [root@master ~]# echo "this is a text" | sed 'p'
    this is a text
    this is a text
     
    # 인쇄 명령을 가장 많이 널리 사용할 때는 텍스트 패턴과 일치하는 텍스트를 포함하는 줄을 출력할 때다.
    # -n 옵션을 사용하면 다른 모든 줄은 억제하고 일치하는 텍스트 패턴이 포함된 줄만 인쇄한다.
    [root@master ~]# sed -n '/number 3/p' data6.txt
    This is line number 3.
     
    [root@master ~]# sed -n '2,3p' data6.txt
    This is line number 2.
    This is line number 3.
     
    # 출력은 원래의 텍스트 줄과 새로운 텍스트 줄을 모두 보여준다.
    [root@master ~]# sed -n '/3/{
    > p
    > s/line/test/p
    > }' data6.txt
    This is line number 3.
    This is test number 3.
    cs


    줄 번호 인쇄하기

    등호 명령은 데이터 스트림 안에서 줄의 현재 번호를 출력한다. 줄 번호는 데이터 스트림에 줄바꿈 문자를 사용하여 결정한다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@master ~]# sed '=' data1.txt
    1
    The quick brown fox jumps over the lazy dog
    2
    The quick brown fox jumps over the lazy dog
    3
    The quick brown fox jumps over the lazy dog
    4
    The quick brown fox jumps over the lazy dog
     
    # 텍스트의 실제 줄 앞에 줄 번호를 출력한다. 특정한 텍스트 패턴을 검색할 때에 등호 명령이 편리하다.
    [root@master ~]# sed -n '/number 4/{
    > =
    > p
    > }' data6.txt
    4
    This is line number 4.
    cs


    줄의 내용 모두 표시하기

    목록(list) 명령(l)은 데이터 스트림에서 텍스트와 인쇄할 수 없느 글자를 모두 출력할 수 있다. 인쇄할 수 없는 글자는 백슬래시 앞에 놓은 8진수 값으로 표시하거나, 탭문자로 \t로 표시하는 것처럼 표준 C스타일의 기호로 표시된다.

    1
    2
    3
    4
    5
    6
    [root@master ~]# sed -n 'l' data9.txt
    This \tline\tcontains\ttabs.$
     
    # 탭 문자의 위치가 \t라는 기호로 표시되었고, 줄 끝에 달러 기호는 줄바꿈 문자를 나타낸다.
    [root@master ~]# sed -n 'l' data10.txt
    This line contains an escape character.$
    cs



    sed에 파일 사용하기

    바꾸기 명령에는 파일 작업을 할 수 있도록 플래그가 포함되어 있다. 


    파일에 쓰기

    w 명령은 파일에 줄을 기록하는 데 사용된다.

    [address]w filename

    파일 이름은 상대 및 절대 경로로 지정될 수 있지만 어떤 경우든 sed편집기를 실행하는 사람이 해당 파일에 대한 쓰기 권한이 있어야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 다음 텍스트 파일의 데이터 스트림 가운데 처음 두 줄을 출력하는 예다.
    [root@master ~]# sed '1,2w test.txt'  data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is line number 4.
    This is line number 5.
     
    [root@master ~]# cat test.txt
    This is line number 1.
    This is line number 2.
     
    # 이 줄들을 STDOUT에 표시하고 싶지 않다면 -n 옵션을 사용할 수 있다.
    # 메일링 리스트와 같이 공통으로 쓰이는 텍스트 값에 기초하여 마스터 파일로부터 데이터 파일을 만들어낼 경우 유용한 도구다.
    [root@master ~]# cat data11.txt
    Blum, R         Browncoat
    McGuiness, A    Alliance
    Bresnahan, C    Browncoat
    Harken, C       Alliance
     
    [root@master ~]# sed -n '/Browncoat/w Browncoats.txt' data11.txt
     
    [root@master ~]# cat data11.txt
    Blum, R         Browncoat
    McGuiness, A    Alliance
    Bresnahan, C    Browncoat
    Harken, C       Alliance
    cs


    파일로부터 데이터 읽기

    sed 커맨드라인에서 데이터를 삽입하고 첨부하는 방법을 알아보았다. 읽기(read) 명령(r)은 별도의 파일에 포함된 데이터를 삽입할 수 있다.

    [address]r filename

    filename 매개변수는 데이터를 포함하는 파일의 절대 또는 상대 경로를 지정한다. 읽기 명령에서는 주소의 범위를 사용할 수 없다. 하나의 줄 번호 또는 텍스트 패턴 주소만을 지정할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    [root@master ~]# sed '3r data12.txt' data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is an added line.
    This is the second added line.
    This is line number 4.
    This is line number 5.
     
    # 데이터 스트림의 마지막에 텍스트를 추가하려면 달로 기호를 사용하면 된다.
    [root@master ~]# sed '$r data12.txt' data6.txt
    This is line number 1.
    This is line number 2.
    This is line number 3.
    This is line number 4.
    This is line number 5.
    This is an added line.
    This is the second added line.
     
    # 삭제 명령과 함께 사용함으로써 파일 안에 있는 위치 표시 기호를 다른 파일에서 가져온 데이터로 대체하는것이다. 
    [root@master ~]# cat notice.std
    Wouldl the following peple:
    LIST
    please report to the ship's catain.
    '# LIST라는 위치 표시 기호를 사용한다. LIST 기호 뒤에 목록을 넣으려면 읽기 명령을 사용하면 된다.
    [root@master ~]# sed '/LIST/{
    > r data11.txt
    > d
    > }' notice.std
    Wouldl the following peple:
    Blum, R         Browncoat
    McGuiness, A    Alliance
    Bresnahan, C    Browncoat
    Harken, C       Alliance
    please report to the ship's catain.

    cs


    댓글

작은거인's Blog / Designed by TISTORY