awk 內建函數涵蓋數學運算、字串處理、時間格式化、檔案/管線 I/O 及系統呼叫,掌握它們能大幅簡化腳本邏輯。
一、算術函數 (同 C 語言 math.h)
| 函數 | 說明 |
atan2(y,x) | y/x 反正切 |
cos(x), sin(x) | 余弦/正弦 (弧度制) |
exp(x) | e^x 指數函數 |
log(x) | 自然對數 ln(x) |
sqrt(x) | 平方根 |
int(x) | 截斷取整 (向零取整) |
rand() | 0~1 均勻亂數 |
srand([x]) | 設定亂數種子,返回前一種子 |
awk 'BEGIN{OFMT="%.3f"; print sin(1), exp(10), log(10), int(3.1415)}'
# 0.841 22026.466 2.303 3
awk 'BEGIN{srand(); print int(100*rand())}' # 0-99 隨機整數
二、字串函數
| 函數 | 說明 | 關鍵行為 |
gsub(ere, repl, [in]) | 全域替換 | 返回替換次數,& 代表匹配串 |
sub(ere, repl, [in]) | 首次替換 | 返回 0/1,修改 in (預設 $0) |
index(s1, s2) | 子字串位置 | 1-based,未找到回 0 |
length([s]) | 字串/記錄長度 | 字符數,非位元組 |
substr(s, m, [n]) | 截取子字串 | m 從 1 起,省 n 截至尾 |
match(s, ere) | 正則匹配位置 | 設定 RSTART/RLENGTH |
split(s, arr, [ere]) | 分割到陣列 | 返回元素數,預設 FS 分割 |
tolower(s), toupper(s) | 大小寫轉換 | 受 LC_CTYPE 影響 |
sprintf(fmt, ...) | 格式化字串 | 同 printf 但返回字串 |
字串函數實戰
# 全域替換數字為 !
awk 'BEGIN{s="test2010test"; gsub(/[0-9]+/,"!",s); print s}' # test!test!
# 正則匹配位置長度
awk 'BEGIN{s="test2010"; match(s,/[0-9]+/); print RSTART, RLENGTH}' # 5 4
# 格式化輸出
awk 'BEGIN{printf "%.2f, %X, %o\n", 124.113, 124, 124}' # 124.11, 7C, 174
三、一般 I/O 與系統函數
| 函數 | 說明 |
close(expr) | 關閉檔案/管線,成功回 0 |
system(cmd) | 執行 shell 指令,返回退出碼 |
expr | getline [var] | 從管線讀取一行 |
getline [var] < expr | 從檔案讀取一行 |
getline [var] | 從 stdin/當前檔讀取 |
I/O 實戰
# 逐行讀取 /etc/passwd
awk 'BEGIN{while((getline < "/etc/passwd") > 0) print $1; close("/etc/passwd")}'
# 管線讀取命令輸出
awk 'BEGIN{while("ls -l" | getline) print $9; close("ls -l")}'
# 互動式讀取
awk 'BEGIN{print "Name:"; getline name; print "Hello " name}'
# 呼叫外部程式
awk 'BEGIN{ret=system("ls -l"); print "exit code:" ret}'
四、時間函數 (gawk 4.1+)
| 函數 | 說明 |
systime() | Unix 時間戳 (1970 秒數) |
mktime("YYYY MM DD HH MM SS") | 建構時間戳 |
strftime([fmt[, ts]]) | 格式化時間輸出 |
常用 strftime 格式
%Y %m %d %H %M %S 年月日時分秒
%F %T 等同 %Y-%m-%d %H:%M:%S
%a %A 週幾縮寫/全名
%b %B 月份縮寫/全名
%j 年內天數 (001-366)
%z %Z 時區偏移/名稱
%% 字面 %
時間運算範例
awk 'BEGIN{
t1=mktime("2023 01 01 00 00 00")
t2=systime()
print "距今秒數:", t2-t1
print "格式化:", strftime("%F %T", t1)
}'
五、格式化字串 sprintf/printf 格式符
| 符號 | 輸出型別 |
%d %i | 有號十進位整數 |
%u | 無號十進位整數 |
%f | 浮點數 |
%e %E | 科學記號 |
%g %G | 自動選擇 %f/%e |
%s | 字串 |
%c | 單一字符 |
%x %X | 十六進位 |
%o | 八進位 |
%p | 指標位址 |
修飾:%5d 寬度、%.2f 精度、%-10s 左對齊、%05d 零填充。
內建函數是 awk 表達力的核心,熟記上表分類與高頻函數簽名,遇到字串切分、時間計算、亂數產生、外部命令整合等場景即可信手拈來。