使用 awk
進行數據格式化
1. 認識 awk
awk
是一個強大的文字處理工具。如果把一個文字檔案想像成一張表格,行就是行(沒錯),而列則是被空格分隔的數據,那麼 awk
就是我們的好朋友。它能幫助我們快速選擇列、篩選行、格式化數據,甚至執行算術操作。
它的名字來自於作者的名字 — Alfred Aho、Peter Weinberger 和 Brian Kernighan(沒錯,就是那位參與創建 C 語言的人)。
awk
的核心概念是通過模式和動作來處理數據,讓它像是一個迷你版的程式語言。
awk
的語法
命令的基本語法如下:
awk '模式 {動作}' 檔案
模式
— 每行檔案會檢查的條件。動作
— 對符合條件的行執行的操作。- 如果沒有提供模式,動作會對每一行執行。
範例:
awk '{print $1}' data.txt
這條命令會列印出檔案 data.txt
每一行的第一列($1
)。
2. awk
的主要功能
1. 選擇列
使用 awk
最簡單的方式就是從檔案中選擇一列或多列。欄位以 $n
表示,其中 n
是從 1 開始的列號。
範例:
輸出第一和第三列:
awk '{print $1, $3}' data.txt
假設我們的檔案 data.txt
看起來是這樣的:
John 25 Engineer
Jane 30 Designer
Mike 28 Developer
結果:
John Engineer
Jane Designer
Mike Developer
2. 條件處理列
條件允許只處理符合特定條件的列。
範例:
輸出第二列值大於 27 的列:
awk '$2 > 27 {print $1, $2}' data.txt
結果:
Jane 30
Mike 28
3. 算術操作
awk
可以執行算術操作。當需要立即計算一些內容時非常有用。
範例:
將第二列的值加 10:
awk '{print $1, $2+10}' data.txt
結果:
John 35
Jane 40
Mike 38
4. 計算列數
awk
自動知道處理了多少列。這些資訊存儲在變數 NR
(Number of Records)中。
範例:
計算檔案中的列數:
awk 'END {print NR}' data.txt
結果:
3
3. 進階功能
1. 輸出格式化
awk
支援透過 printf
函數進行強大的格式化輸出。這是 C 語言中 printf
函數的類似物。
範例:
以對齊方式輸出資料:
awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt
結果:
John 25 Engineer
Jane 30 Designer
Mike 28 Developer
2. 變數
你可以使用變數來保存資料並簡化操作。
範例:
計算第二欄的總和:
awk '{sum += $2} END {print "總年齡:", sum}' data.txt
結果:
總年齡: 83
3. 正規表示式
awk
支援正規表示式以搜尋字串。
範例:
輸出第一欄中有字母 J
的行:
awk '/J/ {print $0}' data.txt
結果:
John 25 Engineer
Jane 30 Designer
4. 實際案例
1. 系統日誌分析
假設我們有一個系統日誌文件 /var/log/syslog
,我們希望知道哪些進程最常被提及。
指令:
cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10
這段指令做了什麼:
cat /var/log/syslog
— 讀取文件內容。awk '{print $5}'
— 提取第五列(進程名稱)。sort
— 按字母順序排序行。uniq -c
— 計算唯一行的數量。sort -nr
— 按數值從高到低排序行。head -10
— 輸出前10個進程。
2. 工資報告準備
我們有一個文件 salaries.txt
:
John 25 4000
Jane 30 5000
Mike 28 4500
任務:
將工資提高10%,並顯示最終報告。
解決方案:
awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt
結果:
John 25 4400.00
Jane 30 5500.00
Mike 28 4950.00
5. 使用 awk
時的常見錯誤
分隔符的問題
預設情況下,awk
使用空格或制表符作為分隔符。如果你的數據用其他東西(例如逗號或冒號)分隔,必須用 -F
選項來指定。
範例:
文件 data.csv
:
John,25,Engineer
Jane,30,Designer
Mike,28,Developer
處理 CSV 的命令:
awk -F',' '{print $1, $3}' data.csv
結果:
John Engineer
Jane Designer
Mike Developer
由於格式問題導致的欄位遺漏
有時候,行可能包含意外的空格或缺少的欄位。這可能會引發錯誤。在開始處理之前檢查數據總是有幫助的。
實際應用
你剛剛學會使用 awk
來分析系統日誌、處理薪資數據以及生成報告。這些技能在處理大型數據庫、CSV 文件和真實項目的日誌時會很有幫助。如果你從事 DevOps,使用 awk
分析系統日誌會成為你的超能力。而如果你是開發者,直接從終端快速操作數據也非常實用。
如果想更深入地學習 awk
,建議閱讀 GNU Awk 官方文檔。現在你肯定知道如何讓你的數據更聽話了!
GO TO FULL VERSION