# 怎么使用awk內置變量
## 一、awk內置變量概述
AWK作為強大的文本處理工具,其內置變量是核心功能之一。這些預定義的變量分為兩類:
- **自動更新變量**:由AWK運行時自動維護(如`NR`、`NF`)
- **可配置變量**:用戶可修改以控制程序行為(如`FS`、`OFS`)
掌握這些變量能顯著提升文本處理效率,下面按功能分類詳解15個關鍵內置變量。
## 二、記錄與字段處理變量
### 1. FS (Field Separator)
- **作用**:定義輸入字段分隔符
- **默認值**:空格/制表符
- **典型用法**:
```awk
BEGIN { FS = "," } # 處理CSV文件
{ print $1, $3 }
FS = "[:,]"
表示冒號或逗號分隔
BEGIN { OFS = "|" }
{ $1=$1; print } # 觸發重組
輸入a b c
輸出為a|b|c
BEGIN { RS = "" } # 空行分隔段落
{ print "段落", NR, ":", $0 }
BEGIN { ORS = "\n---\n" }
{ print }
每行輸出后添加分隔線
{ print $NF } # 打印最后一個字段
{ print $(NF-1) } # 打印倒數第二個字段
NR >= 10 && NR <= 20 # 處理10-20行
END { print "總行數:", NR }
作用:當前文件的記錄數(多文件處理時有用)
對比示例:
# file1.txt內容為3行,file2.txt為5行
{ print FILENAME, FNR, NR }
輸出顯示FNR每個文件重置,NR持續累加
BEGIN { OFMT = "%.2f" }
{ print 3.1415926 } # 輸出3.14
BEGIN { CONVFMT = "%d" }
{ a = "123.45"; print a+1 } # 輸出124
{ print FILENAME ":" FNR ":" $0 }
END { print "處理了", ARGC-1, "個文件" }
BEGIN {
for (i=1; i<ARGC; i++)
if (ARGV[i] ~ /^-/) # 處理選項參數
delete ARGV[i]
}
match()
的結果
RSTART
:匹配開始位置RLENGTH
:匹配長度
{
if (match($0, /[0-9]+/))
print "找到數字:", substr($0, RSTART, RLENGTH)
}
arr["a", "b"] = 1 # 實際存儲為a\034b
{ print "用戶:", ENVIRON["USER"] }
BEGIN { IGNORECASE = 1 }
/hello/ # 匹配Hello/HELLO等
# 分析Nginx日志(空格分隔)
BEGIN {
FS = "[ \t]+";
print "訪問量統計"
}
{
ip_count[$1]++;
status[$9]++;
if ($6 ~ /GET/) method["GET"]++;
else if ($6 ~ /POST/) method["POST"]++;
}
END {
print "獨立IP:", length(ip_count);
print "狀態碼分布:";
for (s in status) print s, status[s];
print "請求方法:";
for (m in method) print m, method[m];
}
# 銷售數據統計(CSV格式)
BEGIN {
FS = ",";
OFS = "\t";
print "月份", "銷售額", "平均額"
}
NR > 1 { # 跳過標題行
sales[$2] += $3;
count[$2]++;
}
END {
for (month in sales) {
avg = sales[month]/count[month];
print month, sales[month], sprintf("%.2f", avg);
}
}
BEGIN
塊中設置變量確保生效$1
等字段變量而非substr()
IGNORECASE
是GNU擴展ENVIRON
END { print "DEBUG: 共處理", NR, "行" }
通過靈活組合這些內置變量,可以實現: - 復雜文本格式轉換 - 結構化日志分析 - 數據清洗與統計 - 自動化報表生成
掌握這些變量后,AWK的處理能力將大幅提升,建議在實際工作中多練習組合使用。 “`
注:本文實際約1500字,包含: - 15個核心變量的詳細說明 - 8個實用代碼示例 - 4類典型應用場景 - 最佳實踐建議 - 格式采用標準Markdown語法(標題、代碼塊、列表等)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。