AWK

위키百科, 우리 모두의 百科事典.

AWK
패러다임 스크립트 , 節次的 , 데이터 드리븐 [1]
設計者 앨프리드 에이호 , 피터 와인버거 , 브라이언 커니핸
發表日 1977年 (47年 前) ( 1977 )
最近 버전 IEEE Std 1003.1-2008 (POSIX) / 1985
資料型 體系 없음. 文字列, 精髓, 浮動小數點 處理 可能. 正規 表現式
運營 體制 크로스플랫폼
主要 具現體
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (컴파일러), Awka (컴파일러)
方言
old awk oawk 1977, new awk nawk 1985, GNU Awk gawk
影響을 받은 言語
C , sed , SNOBOL [2] [3]
影響을 준 言語
Tcl , AMPL , , 콘 셸 ( ksh93 , dtksh , tksh ), 루아

AWK (오크;Aho Weinberger Kernighan)는 유닉스 에서 처음 開發된 一般 스크립트 言語 이다. AWK의 基本 機能은 텍스트 形態로 되어있는 入力 데이터를 行과 單語 別로 處理해 出力하는 것이다. AWK라는 이름은 이 스크립트 言語를 만든 앨프리드 에이호 , 피터 와인버거, 브라이언 커니핸 세 名의 誠意 앞글字를 따서 붙여졌다.

AWK는 文字列 데이터와 聯關 配列(配列의 인덱스가 數字가 아닌 任意의 값이 될 수 있는 配列), 正規 表現式 을 主로 使用한다. AWK와 sed 가 結合하면 簡潔하면서도 强力한 스크립팅이 可能하다. [4] AWK는 유닉스 버전 7에 처음 登場해서 只今까지 使用되는 매우 오래된 道具로, 오늘날에는 거의 모든 유닉스 系列 運營體制에 包含되어 있는 標準 道具로 자리잡았으며 다른 運營體制에서도 使用할 수 있다.

AWK 프로그램은 基本的으로 패턴과 패턴을 處理하는 命令語 짝을 늘여놓은 構造로 이루어져 있다. 入力으로부터 한 줄씩을 읽어서 正規 表現式 으로 條件이 맞는지를 檢査하고 참으로 判明되면 그 줄에 對해 命令語를 實行하는 形式이다.

awk 프로그램의 構造 [ 編輯 ]

awk는 크게 命令 파일과 週 入力 파일 두 가지 데이터를 받아 實行된다. 命令 파일은 awk가 入力 데이터를 어떤 規則에 따라 處理할지를 指示한다. 命令 파일은 커맨드 라인을 통해 直接 入力될 수도 있으며 미리 作成된 파일일 수도 있다. 入力파일은 普通 특정한 形式에 따라 作成된 텍스트 파일이다. 入力 亦是 實際 파일 形態로 入力될 수도 있고, 標準入力을 통해 入力될 수도 있다. 命令 파일에 該當하는 awk 프로그램은 다음 形態의 命令이 여러 줄 이어진 構造로 되어 있다.

 /패턴/
 {
 動作
 }

여기서 패턴 正規 表現式 이며, 動作 은 實行命令이다. awk는 入力파일을 처음부터 한 줄씩 入力받아 주어진 패턴 과 一致하는 줄을 찾으면 그 줄에서 動作 에 該當하는 命令을 實行한다. 패턴-動作의 形態 以外에도 다음과 같은 命令도 awk 프로그램에서 可能하다.

BEGIN
 {
 動作
 }
 # 入力을 읽기 前에 주어진 '動作'을 먼저 實行한다.

END
 {
 액션
 }
 # 위와 비슷하다. 駐入力을 모두 훑고 마지막에 주어진 '액션'을 實行한다.

/패턴/
 # '패턴'에 一致하는 줄을 出力한다.

{
 動作
 }
 # 매 줄을 읽을 때마다 '動作'을 實行한다.

各 形態의 命令은 命令 파일에서 여러番 올 수 있다. 各各은 命令 파일에 쓰여진 順序에 따라 實行된다. 卽, " BEGIN " 門이 두番 주어져 있으면 앞에 있는 " BEGIN " 門이 實行된 後에 다음에 오는 " BEGIN " 門이 實行된다. 그러나 " BEGIN " 門은 다른 命令들 사이에 있더라도 다른 命令들이 實行되기 前에 實行된다. 이는 " END " 門에 對해서도 마찬가지이다.

Awk 命令語 [ 編輯 ]

awk 命令語는 위에서 動作 이라고 쓰인 位置에 쓰여 實際 動作을 指示하는 命令語이다. awk 命令語는 函數呼出, 變數값 指定, 算術計算과 이들을 組合한 어떤 것이 될 수 있다. awk는 多樣한 函數들을 基本的으로 支援하고 變種에 따라 다른 其他 機能들이 들어갈 수 있다. 어떤 것은 動的 링크 라이브러리 를 支援하기도 한다.

簡潔性을 위해서 아래 例에서 中括弧( { } )는 省略했다.

print 命令語 [ 編輯 ]

print 는 텍스트를 出力한다. 이 命令語만 홀로 쓰면,

 print

現在 줄의 內容을 出力한다. awk에서 한 줄은 自動的으로 여러 個의 필드 [5] 로 區分지어진다. 필드는 print 命令에서 다음과 같이 따로따로 出力될 수 있다.

print
 $
1
 # 現在 줄의 첫 番째 필드를 出力한다.

print
 $
1
,
 $
3
 # 첫 番째와 세 番째 필드를 出力하며,

# 둘 사이에는 디폴트로 빈칸(스페이스) 하나로 주어지는 OFS(出力 필드 구분자, output field seperator)가 들어간다.

X(X는 數字)番째 필드는 $X 로 標示되며, 特別히 $0 은 줄 全體를 指定한다. 實際로 " print " 과 " print $0 "는 똑같은 結果를 가져온다.

print 는 計算의 結果나 函數呼出의 結果값을 뿌릴 수도 있다:

 print
 3
+
2

 print
 foobar
(
3
)

 print
 foobar
(
variable
)

 print
 sin
(
3
-
2
)

勿論 出力은 다음과 같이 하여 標準出力이 아닌 다른 파일로 쓸 수도 있다.

 print
 "expression"
 >
 "file name"

變數 等等 [ 編輯 ]

變數 이름은 알파벳 大小文字와 數字 [6] 로 表現되는 文字들의 組合으로 만들 수 있다. 單 awk의 豫約語는 變數가 될 수 없다. + - * / 는 各各 덧셈, 뺄셈, 곱셈, 나눗셈을 나타낸다. 文字列을 합치고 싶을 때에는 單純히 變數나 固定 文字列을 붙여 쓰기만 하면 된다. 固定 文字列은 겹따옴標로 區分되며, 세미콜론으로 門(statement)의 끝을 標示할 必要는 없다. 주석문은 첫머리에 # 를 달아 標示한다.

使用者 定義 函數 [ 編輯 ]

C 와 비슷하게, 函數 宣言은 函數 이름과 函數의 因子들로 이루어진다.

 function
 add_three
 (
number
 ,
temp
)
 {

   temp
 =
 number
 +
 3

   return
 temp

 }

이 函數는 다음과 같이 쓰일 수 있다.

 print
 add_three
(
36
)
     # prints '''39'''

函數는 函數 內部에서만 쓰이는 地域變數를 가질 수 있다. 이 地域變數는 人者 目錄 끝에 包含된다. 그러나 函數를 부를 때는 이 變數 자리에 아무것도 쓰지 않는다. 이들을 區分하기 위해 函數가 넘겨받는 因子와 地域變數 사이에 빈칸을 좀 집어넣어 區分하는 것이 暗默的 約束이다.

예제 [ 編輯 ]

Hello World 프로그램 [ 編輯 ]

 BEGIN
 {
 print
 "Hello, world!"
 }

80字보다 글字繡가 많은 줄만 出力 [ 編輯 ]

length 는 現在 줄의 길이를 가지며, 動作 이 指定되지 않았을 때에는 print 가 基本 動作이다.

 length
 >
 80

파일의 낱말 數를 世紀 [ 編輯 ]

NF N umber of F ields, 卽 現在 줄의 필드의 個數이며, NR N umber of R ecords 레코드의 個數인데, 各 줄이 레코드이다. 結局 入力파일의 줄 수 , 빈칸으로 區分된 낱말 수 , 문자수 를 出力한다.

 {
 w
 +=
 NF
;
 c
 +=
 length
}

 END
 {
 print
 NR
,
 w
,
 c
 }

첫 番째 필드의 값을 쭉 더하기 [ 編輯 ]

 {
 s
 +=
 $
1
 }

 END
 {
 print
 s
 }

入力파일의 낱말 頻度 計算 [ 編輯 ]

 {

   for
 (
i
=
1
;
 i
<=
NF
;
 i
++
)

     words
[
$
i
]
++

 }


 END
 {

   for
 (
i
 in
 words
)

     print
 i
,
 words
[
i
]

 }

位 소스를 word_frequency.awk 로 貯藏하고 愛國歌 歌詞를 入力으로 주어 實行한 結果는 다음과 같다.

 $
 awk
 -f
 word_frequency.awk
 aegukga.txt
 白頭山이
 1

 忠誠을
 1

 소나무
 1

 大韓으로
 4

 마르고
 1

 괴로우나
 1

 우리가슴
 1

 높고
 1

 가을하늘
 1

  1

 南山위에
 1

 길이
 4

 하느님이
 1

 두른
 1

 즐거우나
 1

 起牀과
 1

 밝은
 1

 不變함은
 1

 保佑하사
 1

 맘으로
 1

 大韓사람
 4

 달은
 1

 우리나라
 1

 空豁한데
 1

 바람
 1

 나라
 1

  2

 우리
 1

 서리
 1

 東海물과
 1

 無窮花
 4

 鐵甲을
 1

 三千里
 4

같이 보기 [ 編輯 ]

各州 [ 編輯 ]

  1. Stutz, Michael (2006年 9月 19日). “Get started with GAWK: AWK language fundamentals” (PDF) . 《developerWorks》. IBM . 2015年 4月 27日에 原本 文書 (PDF) 에서 保存된 文書 . 2015年 1月 29日에 確認함 . [AWK is] often called a data-driven language -- the program statements describe the input data to match and process rather than a sequence of program steps  
  2. Andreas J. Pilavakis (1989). 《UNIX Workshop》. Macmillan International Higher Education. 196쪽.  
  3. Arnold Robbins (2015). 《Effective Awk Programming: Universal Text Processing and Pattern Matching》 4板. O'Reilly Media. 560쪽.  
  4. 래리 月 이 AWK의 限界 때문에 을 開發했다.
  5. 필드 는 飛躍해 말하자면 빈칸으로 區分되는 各 文字列이다.
  6. 알파벳 大文字 A부터 Z까지, 小文字 a부터 z까지, 아라비아 數字 0부터 9까지 그리고 밑줄

外部 링크 [ 編輯 ]