[쉘 스크립트] 쉘 스크립트 기초 - sed와 gawk (9)

업데이트:     Updated:

카테고리:

태그:

🎯sed 편집기 소개

sed 편집기는 커맨드라인 또는 명령 텍스트 파일에 저장한 명령에 따라서 데이터 스트림의 데이터를 조작할 수 있다. sed 편집기는 다음과 같은 일을 한다.

  1. 입력 수단으로부터 한 번에 한 줄씩 읽어 들인다.
  2. 제공된 편집기 명령으로 데이터를 대조한다.
  3. 명령에서 지정된대로 스트림의 데이터를 바꾼다.
  4. STDOUT으로 새로운 데이터를 출력한다.

sed 명령어 형식

$ sed [options] script file
  • options 필드에서 사용 가능한 옵션은 다음과 같다.
    • -e script: 하나 이상의 명령을 추가할 때 사용한다.
    • -f file: 명령으로 이루어진 파일을 지정한다.
    • -n: 각 명령에 대한 출력을 만들어 내지는 않지만 print 명령을 기다린다.

커맨드라인에서 sed 명령

기본적으로 sed 편집기는 지정된 명령을 STDIN 입력 스트림에 적용한다. 따라서 처리할 데이터를 sed 편집기에 직접 파이프로 보낼 수 있다. 다음은 이와 같은 작업을 수행하는 방법을 보여주는 간단한 예다.

$ echo "This is a test" | sed 's/test/big test/'
This is a big test

이 예는 sed 편집기의 s 명령을 사용했다. s 명령은 슬래시 사이에 지정된 첫 번째 텍스트 문자열을 두 번째 텍스트 문자열로 바꿨다. 이 예에서는 “test”가 “big test”로 바뀌었다.

텍스트 파일 입력

sed 명령은 입력으로 텍스트 파일을 사용할 수도 있다. 주어진 텍스트 파일이 여러 줄로 이루어져 있을 때 sed 명령은 각 줄을 처리할 때 마다 결과를 표시한다.

$ 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.
$ 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.

여기서 중요한 사실이 하나 있다. sed 편집기는 텍스트 파일 자체의 데이터를 바꾸지는 않는다는 점이다. sed 편집기는 단지 STDOUT에 변경된 텍스트를 보낼 뿐이다. 다시 텍스트 파일을 확인해보면 원래의 데이터를 담고 있는 것을 알 수 있다.

$ 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.

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

sed 커맨드라인에서 하나 이상의 명령을 실행하려면 -e 옵션을 사용한다.

  • -e 옵션에 나열된 명령은 입력된 데이터의 각 줄에서 차례로 적용된다.
  • 각 명령은 세미콜론으로 구분해야 하며 명령과 세미콜론 사이에 빈 칸이 있으면 안된다.
  • 명령을 구분하기 위해 세미콜론을 사용하는 방법 대신 보조 프롬프트를 사용할 수도 있다. sed 편집기의 명령 목록을 열기 위해 홑따옴표 하나를 입력하면, bash는 닫는 홑따옴표가 입력될 때까지 더 많은 명령을 받는 보조 프롬프트를 표시한다.
# 세미콜론
$ sed -e '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.

# 보조프롬프트
$ sed -e '
> 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.

파일에서 명령 읽기

처리해야 할 sed 명령이 많다면 별도의 파일에 저장하는 것이 더 쉬울 때도 있다. sed 명령에서 이러한 파일을 지정하기 위해서는 -f 옵션을 사용해야 한다.

  • 이 경우, 각 명령 끝을 구분하기 위해 세미콜론을 넣으면 안된다. sed 명령은 각 줄마다 별개의 명령이 포함되어 있다는 것을 알고 있기 때문이다.
  • 커맨드라인에 명령을 입력할 때와 마찬가지로 sed 편집기는 지정된 파일에서 명령을 읽어 데이터 파일의 각 줄에 적용한다.
$ cat script1.sed 
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ 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.

바꾸기 플래그

바꾸기 명령은 여러 줄에 걸친 텍스트를 바꿀 때에는 잘 동작하지만 기본적으로 각 줄에 처음 나오는 문자열만을 바꾼다. 바꾸기 명령이 텍스트에서 다른 장소에 나오는 문자열에도 적용되게 하려면 바꾸기 명령의 플래그를 사용해야 한다. 바꾸기 플래그는 바꾸기 명령 문자열 뒤에 설정한다. 다음은 네 가지 유형의 바꾸기 플래그이다.

s/pattern/replacemnt/flags
  • 숫자: 몇 번째로 나타나는 패턴을 새로운 텍스트로 바꿀지를 뜻함
  • g: 기존의 텍스트에서 나타나는 모든 패턴을 바꿔야 한다는 것을 뜻함
  • p: -n 옵션과 조합하여 사용하면 바꾸기 명령으로 변경된 줄만 출력하게 한다
  • w file: 바꾼 결과를 파일에 쓴다. 이때 STDOUT에는 sed 에디터의 정상 출력이 표시되지만 출력 파일에는 일치하는 패턴을 포함한 줄만 표시된다.
# 원본데이터
$ cat data2.txt 
This is a test of the test script.
This is the second test of the trial script.
This is a different line.

# 플래그: X
$ sed 's/test/trial/' data2.txt 
This is a trial of the test script.
This is the second trial of the trial script.
This is a different line.

# 플래그: 숫자
$ sed 's/test/trial/2' data2.txt 
This is a test of the trial script.
This is the second test of the trial script.
This is a different line.

# 플래그: g
$ sed 's/test/trial/g' data2.txt 
This is a trial of the trial script.
This is the second trial of the trial script.
This is a different line.

# 플래그: p
$ sed 's/test/trial/p' data2.txt 
This is a trial of the test script.
This is a trial of the test script.
This is the second trial of the trial script.
This is the second trial of the trial script.
This is a different line.

# -n 옵션 + p 플래그
$ sed -n 's/test/trial/p' data2.txt  
This is a trial of the test script.
This is the second trial of the trial script.

# 플래그: w
$ sed 's/test/trial/w result.txt' data2.txt 
This is a trial of the test script.
This is the second trial of the trial script.
This is a different line.
$ cat result.txt 
This is a trial of the test script.
This is the second trial of the trial script.

주소 사용하기

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

  • 숫자 범위로 된 줄
  • 줄을 걸러내기 위한 텍스트 패턴 필터

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

[address] command

OR

[address]{
  command1
  command2
  command3
}

숫자로 주소 지정하기

숫자 줄 주소를 사용하는 경우 텍스트 스트림에서의 줄의 위치를 사용하여 줄을 참조한다. sed 편집기는 텍스트 스트림의 첫 번째 줄을 줄 번호 1로 하고 각각의 새로운 줄에 차례대로 번호를 매긴다.

  • 명령에서 지정한 주소는 단 한줄의 번호 또는 [시작 줄 번호-쉼표-마지막 줄 번호]로 지정한 줄의 범위가 될 수 있다.
  • 텍스트 안에서 텍스트의 어떤 지점에서 시작하지만 텍스트 끝가지 가는 줄의 그룹에 명령을 적용하고 싶다면 특별한 주소인 달러기호를 쓸 수 있다.
# 단일 줄 번호
$ 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.

# 줄 번호 범위
$ 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.

# 달러기호
$ sed '1,$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.

텍스트 패턴 필터로 주소 지정하기

sed 편집기는 명령을 적용할 줄을 걸러내기 위한 텍스트 패턴을 지정할 수 있다. 형식은 다음과 같다.

/pattern/command
  • 지정한 패턴은 슬래시로 감싸야 한다. sed 편집기는 사용자가 지정한 텍스트 패턴을 포함하는 줄에만 명령을 적용한다.
  • sed는 복잡한 패턴을 만들 수 있도록 텍스트 패턴에 정규표현식 기능을 사용할 수 있다.
  • 다음은 사용자 root에 대해서만 기본 쉘을 바꾸는 방법이다.
$ sed '/root/s/bash/csh/' /etc/passwd
root:x:0:0:root:/root:/bin/csh 

지정된 주소에 여러 명령 적용하기

개별 줄에 하나 이상의 명령을 수행해야 하는 경우 중괄호로 명령을 그룹화할 수 있다. sed 편집기는 그룹 안에 속해 있는 각 명령으로 주소 줄을 처리한다.

$ sed '2,3{
> 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 elephant jumps over the lazy cat.

지우기 명령

텍스트 바꾸기 명령만이 sed 편집기에서 사용할 수 있는 유일한 명령은 아니다. 텍스트 스트림에서 특정한 텍스트 줄을 지워야 하는 경우에는 삭제 명령을 사용할 수 있다.

  • 삭제 명령은 d를 사용한다.
  • 제공된 줄 주소 체계와 일치하는 모든 텍스트 줄을 지운다. 주소 체계를 지정하지 않으면 모든 줄이 삭제된다.
  • 줄 주소는 숫자 범위로 된 줄 이거나 텍스트 패턴 필터 모두 사용 가능하다.
  • 두 개의 텍스트 패턴을 사용하면 일정 범위의 줄을 지울 수 있다. 텍스트 패턴은 쉼표로 구분되며 지정된 첫 번째 패턴은 줄 삭제 기능을 켜고, 두 번째 패턴은 줄 삭제 기능을 끈다. sed 편집기는 두 패턴 사이에 있는 줄을 지운다. (지정된 패턴을 포함한 줄 포함)
  • 또한 sed 편집기는 시작 패턴을 감지할 때마다 삭제 기능을 켠다. 이 문제는 예기치 못한 결과를 일으킬 수 있다.
    • 의도하지 않은 줄에서 삭제 기능이 켜질 수 있다.
    • 삭제 기능을 키는 패턴을 발견하고 정지 패턴을 찾지 못하면 해당 범위 내 모든 줄은 삭제된다.
# 의도하지 않은 줄(5)에서 삭제 기능이 다시 켜짐
$ cat -n data3.txt 
     1  This is line number 1
     2  This is line number 2
     3  This is line number 3
     4  This is line number 4
     5  This is line number 1 again
     6  This is text you want to keep
     7  This is the last line in the file
$ sed '/1/,/3/d' data3.txt 
This is line number 4

# 중지 패턴을 찾지 못했기 때문에 모든 줄이 삭제됨
$ sed '/1/,/5/d' data3.txt
$

Note: sed 편집기는 원본 파일을 건드리지 않는다는 것을 잊지 말자. 삭제된 모든 줄은 sed 편집기의 출력에서는 사라졌다. 하지만 원본 파일은 여전히 ‘삭제된’줄을 포함하고 있다.

insert, append 명령

sed 편집기는 다른 편집기와 마찬가지로 데이터 스트림에 텍스트 줄을 삽입하고 추가할 수 있는 명령이 있다.

  • 삽입(insert) 명령: 지정된 줄 앞에 새로운 줄 추가
  • 첨부(append) 명령: 지정된 줄 다음에 새로운 줄 추가

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

sed '[address]command\
new line'
  • 데이터 스트림 라인 안쪽에 새 데이터를 추가하려면 sed 편집기에 데이터가 표시되어야 할 곳을 알려주기 위해 주소를 사용해야 한다.
  • 이러한 명령을 사용할 때에는 단 한줄의 주소만을 지정할 수 있다.
  • 숫자 줄 번호 또는 텍스트 패턴 중 하나로 조건을 지정할 수 있지만 주소의 범위를 사용할 수는 없다.
  • 스트림의 끝에 텍스트의 새로운 줄을 덧붙이려면 데이터의 마지막 줄을 나타내는 달러 기호를 사용하면 된다.
  • 데이터 스트림의 시작 부분에 새로운 줄을 추가하려면 줄 번호 1앞에 새 줄을 삽입하면 된다.
  • 한 줄이 넘어가는 텍스트를 삽입 또는 첨부하려면 새 텍스트가 마지막줄에 이를 때까지 텍스트의 각 줄에 백슬래시를 넣어야 한다.
# 원본 데이터 스트림
$ cat data4.txt 
This is line number 1
This is line number 2
This is line number 3
This is line number 4

# 데이터 스트림의 세 번째 줄 뒤에 새로운 줄 추가
$ sed '3a\
> This is an appended line.' data4.txt
This is line number 1
This is line number 2
This is line number 3
This is an appended line.
This is line number 4

# 데이터 스트림의 마지막 줄 뒤에 새로운 줄 추가
$ sed '$a\
> This is the last line in the file' data4.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
This is the last line in the file

# 데이터 스트림의 첫 번째 줄 앞에 새로운 줄 추가
$ sed '1i\
> This is one line of new text' data4.txt
This is one line of new text
This is line number 1
This is line number 2
This is line number 3
This is line number 4

# 데이터 스트림의 첫 번째 줄 앞에 새로운 여러 줄 추가
$ sed '1i\
> This is one line of new text \
> This is another line of new text' data4.txt
This is one line of new text 
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

변경 명령

변경(change) 명령을 사용하면 데이터 스트림에서 텍스트 줄의 전체 내용을 바꿀 수 있다. 이 명령은 insert, append 명령과 같은 방식으로 동작한다.

  • 변경 명령은 데이터 스트림에서 지정된 주소에 일치하는 어떤 줄의 텍스트든 바꾼다.
  • 변경 명령에 주소 범위를 사용할 수 있다. 이때 범위에 해당하는 모든 줄은 새로운 줄로 변경된다.
# 데이터 스트림의 세 번째 줄 변경
$ sed '3c\
> This is a changed line of text' data4.txt
This is line number 1
This is line number 2
This is a changed line of text
This is line number 4

# 데이터 스트림의 두 번째에서 세 번째 줄 범위에 해당하는 줄 변경
$ sed '2,3c\
> This is a changed line of text' data4.txt
This is line number 1
This is a changed line of text
This is line number 4

문자 변환 명령

변환 명령(y)은 한 개의 문자에 대해 실행되는 유일한 sed 편집기 명령이다. 변환 명령은 다음과 같은 형식을 사용한다.

[address]y/inchars/outchars/
  • 변환 명령은 inchars와 outchars 값을 일대일로 대응시킨다. inchars의 첫 번째 문자는 outchars의 첫 번째 문자로 변환된다.
  • inchars의 두 번째 문자는 outchars의 두 번째 문자로 변환된다. 이러한 대응은 지정된 문자의 길이 동안 계속 된다.
  • inchars 및 outchars의 길이가 같지 않은 경우 sed 편집기는 오류 메시지를 낸다.
  • 변환 명령은 전역 명령이다. 어디에서 나타나든 관계없이 텍스트 줄에서 발견되는 모든 문자에 대해 변환을 수행한다.
# 123/456
$ cat <<EOF | sed 'y/123/456/'
> This is line number 1
> This is line number 2
> This is line number 3
EOF
This is line number 4
This is line number 5
This is line number 6

# 전역
$ echo "This 1 is a test of 1 try." | sed 'y/123/456/'
This 4 is a test of 4 try.

출력 명령

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

  • p 명령: 텍스트 줄을 인쇄
  • = 명령: 줄 번호를 출력
  • l 명령: 줄의 내용을 모두 출력

p 명령

바꾸기 명령의 p 플래그와 같이 p 명령은 sed 편집기의 출력 과정에서 한 줄을 출력한다. 커맨드라인에서 -n 옵션을 사용하면 다른 모든 줄은 억제하고 일치하는 텍스트 패턴이 포함된 줄만 출력하는데 활용될 수 있다.

# p 명령
$ echo "This is a test" | sed 'p'
This is a test
This is a test

# -n 옵션 + p 명령
$ echo "This is a test" | sed -n 'p' 
This is a test

# 텍스트 패턴 매칭
$ cat <<EOF | sed -n '/number 3/p'
> This is line number 1
> This is line number 2
> This is line number 3
> This is line number 4
EOF
This is line number 3

# 숫자 줄 범위 매칭
$ cat <<EOF | sed -n '2,3p'
> This is line number 1
> This is line number 2
> This is line number 3
> This is line number 4
EOF
This is line number 2
This is line number 3

# 바꾸기 명령과 함께 사용
$ sed -n '/number 3/{
> p
> s/line/test/p
> }' data4.txt
This is line number 3
This is test number 3

= 명령

등호 명령은 데이터 스트림 안에서 줄의 현재 번호를 출력한다. 줄 번호는 데이터 스트림에 줄바꿈 문자를 사용하여 결정된다. 줄바꿈 문자가 나타날 때마다 sed 편집기는 텍스트의 한 줄이 끝났다고 가정한다.

$ sed '=' data4.txt
1
This is line number 1
2
This is line number 2
3
This is line number 3
4
This is line number 4

l 명령

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

$ cat data5.txt 
This    line    contains        tabs.
$ sed -n 'l' data5.txt 
This\tline\tcontains\ttabs.$
  • 탭 문자는 \t 기호로 표시되었다.
  • 줄 끝에 있는 달러 기호는 줄바꿈 문자를 나타낸다.
  • 이스케이프 글자를 포함한 데이터 스트림이 있다면 목록 명령은 필요한 경우 8진수 코드를 사용하여 이를 표시한다.

sed에 파일 사용하기

바꾸기 명령에는 파일 작업을 할 수 있도록 플래그가 포함되어 있다. 바꾸기 명령을 쓰지 않고도 이러한 일을 할 수 있는 정식 sed 편집기 명령도 있다.

  • 쓰기 명령(w)
  • 읽기 명령(r)

쓰기 명령

[address]w filename
  • 파일 이름은 상대 및 절대 경로로 지정될 수 있지만, 어떤 경우든 sed 편집기를 실행하는 사람이 해당 파일에 대한 쓰기 권한이 있어야 한다.
  • 주소는 하나의 줄, 하나의 텍스트 패턴이나, 텍스트 패턴의 범위와 같이 sed 편집기에서 주소 지정에 쓸 수 있는 어떤 방법이든 사용할 수 있다.
$ sed '1,2w result.txt' data4.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
$ cat result.txt 
This is line number 1
This is line number 2

읽기 명령

[address]r filename
  • 파일 이름은 데이터를 포함하는 파일의 절대 또는 상대 경로를 지정한다.
  • 읽기 명령에서는 주소의 범위를 사용할 수 없다. 하나의 줄 번호 또는 텍스트 패턴 주소만을 지정할 수 있다.
  • sed 편집기는 주소 뒤에 파일에서 가져온 텍스트를 삽입한다.
$ sed '3r data6.txt' data4.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

🎯gawk 프로그램

sed 편집기는 즉석에서 텍스트 파일을 수정하기 위한 편리한 도구이지만 한계가 있다. 파일의 데이터를 수정하고 재구성할 수 있는 좀 더 프로그래밍에 가까운 환경을 제공하는 고급 데이터 조작 도구가 필요하다 여기서 gawk이 등장한다. gawk 프로그래밍 언어 안에서는 다음과 같은 일을 할 수 있다.

  • 데이터를 저장하는 변수 정의
  • 데이터를 다룰 수 있도록 산술 및 문자열 연산자 사용
  • if-then 및 루프문과 같이 데이터 처리에 로직을 추가하는 구조적 프로그래밍 개념 사용
  • 데이터 파일 안에서 데이터 요소를 추출하고 다른 순서 또는 형식으로 재구성하여 형식화된 보고서 생성

gawk 명령 형식

gawk options program file
  • options 필드에는 다음과 같은 옵션을 제공한다.
    • -F fs: 한 줄에서 데이터 필드의 경계를 식별하기 위한 파일 구분자를 지정한다.
    • -f file: 프로그램이 읽어 들일 파일 이름을 지정한다.
    • -var=value: gawk 프로그램에서 사용할 변수의 기본값을 정의한다.
    • mf N: 데이터 파일에서 처리할 필드의 최대 수를 지정한다.
    • mr N: 데이터 파일에서 최대 레코드 크기를 지정한다.
    • -W keyword: gawk의 호환성 모드를 경고 수준으로 지정한다.

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

gawk 프로그램 스크립트는 열고 닫는 괄호로 정의된다. 스크립트 명령은 두 중괄호 사이에 있어야 한다. 또한 gawk 커맨드라인은 스크립트를 하나의 텍스트 문자열로 가정하기 때문에 홑따옴표로 스크립트를 묶어야 한다.

$ gawk '{print "Hello World!"}'
This is a test
Hello World!
This is another test
Hello World!
  • 이 프로그램 스크립트는 한 개의 명령인 print 명령을 정의한다.
  • print 명령은 STDOUT에 텍스트를 출력한다.
  • 이 예제에서 커맨드라인에 어떤 파일 이름도 정의되지 않았기 때문에 gawk 프로그램은 STDIN에서 데이터를 검색한다.
  • 텍스트를 한 줄 입력하고 키를 누르면 gawk 프로그램은 그제서야 스크립트를 통해 텍스트를 처리한다.
  • sed 편집기처럼 gawk 프로그램은 데이터 스트림에서 사용할 수 있는 텍스트의 각 줄에 대해 프로그램 스크립트를 실행한다.
  • 위 프로그램 스크립트는 고정된 텍스트 스트링을 표시하도록 설정되어 있기 때문에 데이터 스트림에 어떤 텍스트를 입력해도 텍스트 출력으로 얻는 것은 똑같다.
  • gawk 프로그램을 종료하려면 데이터 스트림이 종료되었다는 신호를 보내야 한다. bash 쉘은 파일 끝(EOF) 문자를 만드는 키 조합을 제공한다. + 키 조합은 bash에서 EOF 문자를 만들어낸다.

데이터 필드 변수 사용하기

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

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

한 줄안에서 각 데이터 필드는 필드 구분자로 결정된다. gawk가 텍스트 한 줄을 읽을 때 이 줄은 지정된 필드 구분자를 사용해서 각 데이터 필드로 분리된다.(gawk의 기본 필드 구분자는 화이트스페이스 문자다) 다른 필드 구분자를 사용하는 파일을 읽는다면 -F 옵션을 사용하여 구분자를 지정할 수 있다.

# 기본 필드 구분자
$ cat data1.txt
One line of test text.
Two lines of test text.
Three lines of test text.
$ gawk '{print $1}' data1.txt
One
Two
Three

# -F 옵션
$ gawk -F: '{print $1}' /etc/passwd | head -n 5
root
daemon
bin
sys
sync

여러 명령 사용하기

gawk 프로그래밍 언어는 여러 가지 명령어를 프로그램에 넣을 수 있다. 커맨드라인에 지정된 프로그램 스크립트에서 여러 명령을 사용하려면 각 명령 사이에 세미콜론을 넣으면 된다. 또는 sed 편집기와 마찬가지로 보조프롬프트를 이용할 수 있다.

# 세미콜론
$ echo "My name is Rich" | gawk '{$4="Chrisine"; print $0}'
My name is Chrisine

# 보조 프롬프트
$ gawk '{
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine

파일로부터 프로그램 읽기

sed 편집기와 마찬가지로 gawk에서도 파일에 프로그램을 저장하고 커맨드라인에서 이를 참조할 수 있다.

# 단일 명령
$ cat script1.gawk 
{print $1 "'s home directory is " $6}
$ gawk -F: -f script1.gawk /etc/passwd | head -n 5
root's home directory is /root
daemon's home directory is /usr/sbin
bin's home directory is /bin
sys's home directory is /dev
sync's home directory is /bin
'

# 여러 명령
$ cat script2.gawk 
{
text = "'s home directory is "
print $1 text $6
}
$ gawk -F: -f script2.gawk /etc/passwd | head -n 5
root's home directory is /root
daemon's home directory is /usr/sbin
bin's home directory is /bin
sys's home directory is /dev
sync's home directory is /bin
'

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

gawk 프로그램은 또한 언제 프로그램의 스크립트를 실행할 수 있는지를 지정할 수 있다. 기본적으로 gawk는 입력 스트림을 통해 한 줄의 텍스트를 읽고 그 텍스트 줄의 데이터에 대해 프로그램 스크립트를 실행한다. 때로는 데이터를 처리하기 전에 스크립트를 실행해야 할 수도 있다. BEGIN 키워드는 이러한 일을 위해서 사용된다. 이 키워드는 gawk가 데이터를 읽기 전에 지정된 프로그램 스크립트를 실행하도록 강제한다.

$ cat <<EOF | gawk 'BEGIN {print "Hello World!"} {print $0}'
> Line 1
> Line 2
> Line 3
EOF
Hello World!
Line 1
Line 2
Line 3

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

BEGIN 키워드와 마찬가지로, END 키워드를 사용하면 gawk가 데이터를 읽은 후에 실행할 프로그램 스크립트를 지정할 수 있다.

$ gawk 'BEGIN {print "The data3 File Contents:"} END {print "End of File"} {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3
End of File

📖출처

리처드 블룸, 크리스틴 브레스, ⌜리눅스 커맨드라인 쉘 스크립트 바이블⌟, 스포트라잇북(2016)


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

Linux 카테고리 내 다른 글 보러가기

댓글남기기