# Linux awk的用法介紹
## 一、awk簡介
awk是一種強大的文本處理工具,由Alfred Aho、Peter Weinberger和Brian Kernighan在1977年開發(名稱取自三人姓氏首字母)。它不僅是Linux/Unix系統中的標準工具,更是一門完整的**模式掃描與處理語言**,擅長:
- 結構化文本分析
- 數據提取與轉換
- 報表生成
- 數學運算
## 二、基本語法結構
```bash
awk 'pattern {action}' input_file
模式(Pattern):
/regex/
$1 > 100
BEGIN
/END
動作(Action):
{}
包裹的語句塊變量 | 描述 | 示例 |
---|---|---|
$0 |
整行內容 | awk '{print $0}' |
$1-$n |
第n個字段 | awk '{print $3}' |
NF |
當前行的字段數 | awk '{print NF}' |
NR |
當前行號(所有文件累計) | awk '{print NR}' |
FNR |
當前文件的行號(多文件獨立計數) | awk '{print FNR}' |
FS |
輸入字段分隔符(默認空格) | BEGIN{FS=":"} |
OFS |
輸出字段分隔符(默認空格) | BEGIN{OFS="-"} |
# 提取passwd文件的用戶名(第1列)
awk -F: '{print $1}' /etc/passwd
# 顯示文件第5-10行
awk 'NR>=5 && NR<=10' filename
# 計算CSV文件第3列總和
awk -F, '{sum+=$3} END{print sum}' data.csv
# 求平均值
awk '{sum+=$1} END{print sum/NR}' numbers.txt
# 篩選內存使用超過1GB的進程
ps aux | awk '$6 > 1024*1024 {print $0}'
# 找出訪問量前5的IP(Apache日志)
awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' access.log | sort -nr | head -5
# 調換前兩列位置
awk '{print $2, $1}' data.txt
# 添加行號并格式化輸出
awk '{printf "%5d | %-20s | %.2f\n", NR, $1, $3}' sales.dat
# 統計單詞頻率
awk '{for(i=1;i<=NF;i++) words[$i]++} END{for(w in words) print w,words[w]}' text.txt
awk '
function myfunc(x) {
return x*2
}
{print myfunc($1)}
' input.txt
# 比較兩個文件的差異
awk 'NR==FNR{a[$0];next} !($0 in a)' file1.txt file2.txt
# 提取含error的行(不區分大小寫)
awk '/[Ee][Rr][Rr][Oo][Rr]/' logfile
# 匹配以數字結尾的行
awk '/[0-9]$/' data.txt
減少管道操作:盡量在awk內完成復雜處理 “`bash
cat file | grep “pattern” | awk ‘{print $1}’
# 優化方案 awk ‘/pattern/{print $1}’ file
2. **預編譯正則**:對重復使用的正則進行預編譯
```bash
awk '/static_regex/{...}' # 每次重新編譯
awk '$0 ~ "static_regex"{...}' # 預編譯模式
gsub()
比外部sed
更快工具 | 優勢場景 | 局限性 |
---|---|---|
grep |
快速行級匹配 | 無法進行字段級處理 |
sed |
流編輯/替換 | 數學計算能力弱 |
awk |
字段處理、復雜計算、報表生成 | 學習曲線較陡峭 |
awk作為文本處理的”瑞士軍刀”,其價值隨著數據復雜度的提升而顯著增長。建議通過以下路徑進階學習: 1. 掌握基礎字段操作 2. 熟練使用內置變量 3. 理解數組和流程控制 4. 最終實現完整的awk腳本開發
附:常用速查表
> # 打印第3列大于50的行 > awk '$3>50' > > # 自定義輸出分隔符 > awk 'BEGIN{OFS="|"} {print $1,$3}' > > # 多條件組合 > awk '/start/,/end/' > ```
注:本文實際約1200字,可根據需要增減示例或調整詳細程度。建議通過man awk
查看系統完整文檔獲取更多細節。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。