Sed和AWK入門教程之AWK篇

來源:互聯網
上載者:User

Sed和AWK入門教程之AWK篇 AWK是一門專門用於文本處理的程式設計語言.是的,它是程式設計語言,它的目的僅有文本處理,所以你不能用它寫系統軟體,或者做科學計算(當然,它也能做數學計算),它只能用於文本處理.與sed不同,AWK具有程式設計語言的特性,有內建函數,有邏輯語句,有輸入輸出語句,其實它看起來很像C語言,只不過所有功能集中於文本處理.與Sed不同,AWK最強大的功能在於處理結構化的文本,也就是說文本有一定的組織圖的.命令格式awk [-F value] [-v var=value] 'program text' [files....]awk [-F value] [-v var=value] -f program-file [files....]例如:[plain] [alex@alexon:~]$awk '{print}' persons.txt   1011, Alex Perkins, Product, Software Developer  3923, Jimmey Mills, Operation, COO  23934, Kevin Kim, Management, CEO  2321, Chris Paul, UI, Designer  又見cat,呵呵. 更有意義一點的:[plain] [alex@alexon:~]$awk -F , -v OFS=: '{print $1, $2, $3, $4}' persons.txt   1011: Alex Perkins: Product: Software Developer  3923: Jimmey Mills: Operation: COO  23934: Kevin Kim: Management: CEO  2321: Chris Paul: UI: Designer  awk能識別文本的結構,還能格式化輸出.程式的格式也就是'program text'或者program file中的內容:BEGIN {actions} /pattern/ {actions} END {actions}BEGIN是處理檔案之前執行的. 中間的叫Body loop.後面的END是處理完結束後執行.可以用\來實現分行輸入:BEGIN {action} \/pattern {action} \END {action}如果寫在檔案中,則可以像寫C語言那樣寫program-file.awk:BEGIN {actions;}/pattern/ {actions;}END {actions;}  AWK的執行方式,先執行BEGIN段內的內容,然後對檔案的每一行,執行body,所有行都處理完後,執行END段.也就是說BEGIN和END都只執行一次,而Body loop要執行很多次,視行數和模式比對而定,因為要執行多次,所以它叫Body loop.內建變數AWK會假定輸入的文本是一個結構化文本,也即是一個表格形式的,每一行是一個記錄(Record),每一列是一個域(Field).AWK讀入時會以結構化方式對文本進行處理,這時就用到了一些內建變數:FS -- Field Separator 域的分隔字元,預設的是以空白符分隔RS -- Record Separator 記錄的分隔字元,預設是以分行符號來分隔FILENAME -- current filenameNF -- Number of Feilds in current recordNR -- Number of Record 輸入的記錄數,相當於行號一樣,多個檔案時會接著遞增.FNR -- File Number of Record 輸入的目前記錄數,每個檔案單獨計算$0 -- the whole record  當前整個記錄$n -- the nth field of the current record 目前記錄和第n個域利用這些內建變數,AWK讀入文本後就可以對文本進行處理,以達到分解結構化文本的目的:把輸入變成一個Table形式的結構化資訊.對就的,輸出的時候也有對應的變數來控制輸出的格式:OFS -- Ouput Field Separator 輸出時的域分隔字元ORS -- Output Record Separator 輸出時的記錄分隔字元語句(actions)print語句以字串形式輸出,後面的每個變數都當成是字串.當以逗號分隔時,就用OFS來分隔域,如果以空格分隔時,就以空格來作為OFS: [plain] [alex@alexon:~]$awk -F, 'BEGIN {OFS=";"} {print $1,$2,$3,$4}' persons.txt   1011; Alex Perkins; Product; Software Developer  3923; Jimmey Mills; Operation; COO  23934; Kevin Kim; Management; CEO  2321; Chris Paul; UI; Designer  [alex@alexon:~]$awk -F, 'BEGIN {OFS=";"} {print $1 $2 $3 $4}' persons.txt   1011 Alex Perkins Product Software Developer  3923 Jimmey Mills Operation COO  23934 Kevin Kim Management CEO  2321 Chris Paul UI Designer  print不跟參數時,輸出當前的記錄.printf語句可以進行與C語言十分類似的格式化輸出. [plain] [alex@alexon:~]$awk -F, 'BEGIN {OFS=";"} {printf "%d: ", NR; print $1,$2,$3,$4}' persons.txt   1: 1011; Alex Perkins; Product; Software Developer  2: 3923; Jimmey Mills; Operation; COO  3: 23934; Kevin Kim; Management; CEO  4: 2321; Chris Paul; UI; Designer   程式語言與C語言十分類似.有運算子,有內建函數,有變數,可以實現十分強大的功能,這部分通常用不到,也不是一篇文章能講的清的,可以參考awk的man文檔或者書籍.推薦<Sed & Awk><Sed and Awk 101 Hacks>Regex元字元有: ^ $ . [ ] | ( ) * + ?AWK中的與標準的Regex一樣:位置符:^ --- 行首$ ----行尾. ----任意非分行符號'\n'符\b ---- 一個單詞結尾,單詞定義為一連串的字母或數字,可以單獨放在一端,也可放二端.限量符* --- 0或1個或多個+ --- 1個或多個? --- 0或1{m} --- 出現m次{m,n} --- 出現m次到n次,如{1,5}表示出現1次到5次不等(1,2,3,4,5次)轉義符\ --- 可以轉義特殊字元字元集[] ---其內的任一字元[^] --- 匹配任何不在此字元集中的字元操作符| ---- 或操作,abc\|123匹配123或者abc(...) ----組合,形成一個組,主要用於索引\n ---- 前面第n個組合, /\(123\)\1/ 則匹配123123

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.