# Linux系統的awk命令怎么用
## 一、awk命令概述
### 1.1 什么是awk
awk是一種強大的文本處理工具,由Alfred Aho、Peter Weinberger和Brian Kernighan三位創始人姓氏首字母命名(Aho-Weinberger-Kernighan)。它不僅是Linux/Unix系統中的標準組件,更是一門功能完備的文本處理編程語言。
### 1.2 awk的核心特性
- **模式掃描與處理語言**:自動掃描文件中的每一行,匹配指定模式后執行相應動作
- **字段處理能力**:自動將輸入行分割為多個字段(默認以空白字符分隔)
- **編程語言特性**:支持變量、條件判斷、循環、數組等編程元素
- **內置函數庫**:提供字符串操作、數學運算、時間處理等豐富函數
- **報表生成能力**:可輕松格式化輸出復雜報表
## 二、awk基本語法結構
### 2.1 命令格式
```bash
awk [選項] '模式 {動作}' 輸入文件
選項 | 說明 |
---|---|
-F | 指定字段分隔符(默認是空白字符) |
-v | 定義變量并賦值 |
-f | 從腳本文件中讀取awk命令 |
-W | 指定兼容模式或開啟擴展功能 |
$0
,分割為$1
到$n
個字段BEGIN {
# 預處理操作(文件讀取前執行)
print "=== 開始處理 ==="
}
{
# 主處理塊(每行都會處理)
}
END {
# 后處理操作(文件處理完后執行)
print "=== 處理完成 ==="
}
/pattern/
/error/ { print "發現錯誤:", $0 }
$1 > 100
$3 >= 5000 { print "高收入:", $1 }
pattern1, pattern2
/START/, /END/ { print "范圍內容:", $0 }
變量 | 說明 | 示例 |
---|---|---|
NR | 當前記錄號(行號) | NR % 2 == 0 |
NF | 當前行的字段數量 | { print $NF } |
FS | 輸入字段分隔符 | BEGIN { FS=":" } |
OFS | 輸出字段分隔符 | BEGIN { OFS="\t" } |
RS | 輸入記錄分隔符(默認\n) | BEGIN { RS="\n\n" } |
ORS | 輸出記錄分隔符 | BEGIN { ORS="\r\n"} |
FILENAME | 當前輸入文件名 | { print FILENAME } |
# 打印第一列和最后一列
awk '{print $1, $NF}' access.log
# 交換第一列和第二列
awk '{temp=$1; $1=$2; $2=temp; print}' data.txt
# 統計每行字段數
awk '{print NF " fields: " $0}' text.txt
# 處理CSV文件(需考慮帶逗號的引用字段)
awk -v FPAT='([^,]+)|("[^"]+")' '{print $3}' data.csv
# 重組字段生成新格式
awk '{printf "用戶%-8s 年齡%2d\n", $1, $2}' users.txt
# 多字符分隔符處理
awk -F'[:=]' '{print $2, $4}' config.ini
{
if ($3 > 1000) {
print "VIP:", $1
} else if ($3 > 500) {
print "高級:", $1
} else {
print "普通:", $1
}
}
# for循環示例
{
sum = 0
for (i=1; i<=NF; i++) {
sum += $i
}
print "總和:", sum
}
# while循環處理字段
{
i = 1
while (i <= NF) {
printf "%s ", toupper($i)
i++
}
print ""
}
# 統計詞頻
{
for (i=1; i<=NF; i++)
words[$i]++
}
END {
for (w in words)
print w, words[w] | "sort -nrk2"
}
# 多維度數組
{
dept[$2]++
total[$2] += $3
}
END {
for (d in dept)
printf "%s: 人數%d 總工資%.2f\n", d, dept[d], total[d]
}
函數 | 說明 | 示例 |
---|---|---|
length(str) | 返回字符串長度 | length($1) |
substr(str, start, len) | 提取子串 | substr($1, 1, 3) |
split(str, arr, sep) | 分割字符串到數組 | split($0, arr, ",") |
gsub(r, s, t) | 全局替換 | gsub(/foo/, "bar", $0) |
match(str, regex) | 返回匹配位置 | match($0, /[0-9]+/)) |
{
print "平方根:", sqrt($1)
print "隨機數:", int(rand()*100)
print "對數:", log($2)
print "正弦值:", sin($3)
}
BEGIN {
print "當前時間戳:", systime()
print "格式化時間:", strftime("%Y-%m-%d %H:%M:%S")
}
{
# 計算時間差(假設$1是時間戳)
diff = systime() - $1
print "已過去", diff/3600, "小時"
}
# 定義函數計算平均值
function avg(arr, size, i, sum) {
sum = 0
for (i=1; i<=size; i++)
sum += arr[i]
return sum/size
}
{
# 使用自定義函數
values[NR] = $3
}
END {
print "平均值:", avg(values, NR)
}
# math.awk
function square(x) { return x*x }
# 主程序
awk -f math.awk -f main.awk data.txt
{
# 將結果通過管道傳遞給外部命令
print $1 | "sort | uniq -c"
# 從命令讀取輸入
"date" | getline current_date
print "報告生成于:", current_date
close("date")
}
# 分析Nginx訪問日志
awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr
# 統計每小時訪問量
awk -F'[:[]' '{hits[$2]++} END {for (h in hits) print h, hits[h]}' access.log
# 監控內存使用
free -m | awk '/Mem/{printf "使用率: %.2f%%\n", $3/$2*100}'
# 找出CPU占用前10的進程
ps aux | awk 'NR>1 {print $3, $11}' | sort -k1 -nr | head
# CSV轉JSON
awk -F, 'BEGIN{print "["} NR>1{printf " {\"name\":\"%s\",\"age\":%d}%s\n", $1, $2, (NR==FNR?"":",")} END{print "]"}' data.csv
# 生成Markdown表格
awk -F'\t' 'BEGIN{print "| 名稱 | 數值 |\n|------|------|"} {printf "| %s | %s |\n", $1, $2}' data.txt
print
語句~
運算符next
語句跳過不必要處理man awk
、info gawk
通過系統學習awk,您將掌握一個處理文本數據的瑞士軍刀。建議從簡單示例開始,逐步嘗試復雜場景,最終將其融入您的日常運維和數據處理工作流中。 “`
注:本文實際約3000字,完整包含了awk的核心概念、語法結構、實用技巧和典型案例。Markdown格式便于直接用于文檔發布或筆記整理,代碼塊和表格都采用標準Markdown語法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。