概述
awk 是一種逐行讀取文字檔案,將每一行分割成欄位(field),然後根據指定的規則進行處理的程式語言。`-F` 選項定義了分隔這些欄位的標準,除了預設的空白字元外,您還可以指定逗號、冒號、特定字串或正規表示式作為分隔符。
主要特點
- 指定使用者自訂欄位分隔符
- 可使用正規表示式作為分隔符
- 處理 CSV、日誌檔案等結構化文字資料
- 輕鬆提取和轉換資料
主要選項
awk 命令提供多種選項,但這裡我們將重點介紹與欄位分隔相關的主要選項 `-F`。
欄位分隔
生成的命令:
請試著組合命令。
這個 Django 應用程序是一個技術指南文檔,旨在為用戶輕鬆解釋 Linux 的各種命令。
`awk` 執行命令。
請將上述選項組合在一起,與 AI 一同虛擬執行命令。
使用範例
以下是使用 `-F` 選項處理各種格式文字資料的範例。
從逗號 (,) 分隔的 CSV 檔案中輸出特定欄位
echo "apple,banana,cherry,date" > data.csv
awk -F',' '{print $1, $3}' data.csv
從 data.csv 檔案中,以逗號為分隔符輸出第一個和第三個欄位。
從冒號 (:) 分隔的 /etc/passwd 檔案中輸出使用者名稱和 Shell
awk -F':' '{print $1, $7}' /etc/passwd
從 /etc/passwd 檔案中輸出使用者名稱(第一個欄位)和登入 Shell(第七個欄位)。
使用正規表示式指定多個分隔符(空白或定位字元)
echo "field1 field2\tfield3" > data.txt
awk -F'[ \t]+' '{print $1, $2}' data.txt
即使有多個連續的空白或定位字元,也會將它們視為一個分隔符,並輸出第一個和第二個欄位。(類似預設行為)
使用特定字串作為分隔符
echo "Header---Content Body---Footer" > multi_line_data.txt
awk -F'---' '{print $1, $2}' multi_line_data.txt
將輸入中的 '---' 字串作為欄位分隔符,輸出第一個和第二個欄位。
輸出第一個欄位為特定值的行的第三個欄位
echo "root:x:0:0:root:/root:/bin/bash\nuser:x:1000:1000:user:/home/user:/bin/bash" > users.txt
awk -F':' '$1 == "root" {print $3}' users.txt
在以冒號分隔的檔案中,僅選取第一個欄位為 'root' 的行,並輸出其第三個欄位。
提示與注意事項
使用 awk -F 時的實用提示和注意事項。
正規表示式分隔符
傳遞給 `-F` 選項的分隔符會被解釋為正規表示式。因此,如果您想將 `.` 或 `*` 等特殊字元作為字面值使用,則需要像 `\.` 或 `\*` 那樣進行逸出。
- 範例:`awk -F'\.' '{print $1}' filename` (使用點(.)作為分隔符)
- 範例:`awk -F'[[:space:]]+' '{print $1}' filename` (使用所有空白字元作為分隔符)
內部變數 FS (欄位分隔符)
`-F` 選項與設定內部變數 `FS` 是相同的。您可以在 `BEGIN` 區塊中設定 `FS` 來動態控制腳本中的分隔符。
- 範例:`awk 'BEGIN {FS=","} {print $1}' data.csv`
輸出欄位分隔符 (OFS)
與輸入欄位分隔符 (`FS`) 不同,您可以設定 `OFS` (Output Field Separator) 變數來指定使用 `print` 語句輸出的欄位之間的ે分隔符。預設值為空白。
- 範例:`awk -F',' 'BEGIN {OFS=":"} {print $1, $3}' data.csv` (輸出時使用冒號而非逗號)