歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> awk-基本語法知識

awk-基本語法知識

日期:2017/2/28 13:44:51   编辑:Linux教程
awk 是一門語言,這當之無愧!awk 除了簡單的文本處理功能,awk具有計算機語言所特有的性質,例如變量、判斷、循環、甚至數組。 簡單的功能: awk 處理文本時,將文本分成一條一條的記錄,awk允許通過匹配代碼(正則)匹配記錄;每條記錄都包含多個字段,awk可以修改字段分隔符來靈活的隔開字段。它提供了($0,$1...)訪問各個字段。

awk 常被用於處理字段。所謂字段,就是文本文件中,每一行分成許多列,列與列之間用特定的字符隔開。

awk 命令分三部分: awk 本身 、 awk要執行的命令內容 、awk的輸入文件。 awk 執行命令時,依次讀取每一行,將命令應用到每一行。 - print 和 print $0 行為完全相同,都是打印一整行! -F 參數設置的是awk的初始化變量FS,FS控制著awk的字段分隔符,默認情況下是空白字符awk 支持設置多個字段分隔符,甚至用正則表達式來設置。 eg. awk -F"[\t ]+" // 表示此分隔符匹配一個或多個制表符或空格符 awk讀取標准輸入。 AWK的代碼結構: awk默認對每一個輸入行執行一段代碼塊。 awk的運行可看成3部分:處理輸入前的初始化(BEGIN{}代碼塊)、處理輸入過程({}代碼塊集合)、處理完所有輸入後的掃尾工作(END{}代碼塊)。 BEGIN代碼塊,主要完成awk部分參數的初始化操作! 核心處理輸入的過程:執行體 END代碼塊,是在所有輸入都處理完成後awk才去運行的代碼! - BEGIN 代碼塊 格式:BEGIN標簽加上{}。 在這個代碼塊中完成一些變量的初始化操作,只在初始化時被運行一次。 eg. awk定義FS變量為字段分隔符,在命令行 -F參數用於指定字段分割符,在BEGIN代碼段中這樣寫: fs.awk // awk 腳本,-f 參數引用腳本到awk命令中
  1. BEGIN{
  2. FS=":" // 將冒號賦給FS變量,改變字段分隔符
  3. }
  4. {
  5. print "USER: " $1 "\tSHELL: " $7
  6. }
  1. head -n10 /etc/passwd |awk -f fs.awk
還可以在命令行直接初始化:
  1. awk 'BEGIN{FS=":"}{print "USER: " $1 "\tSHELL: " $7}'
-F 和 FS 都可以改變字段分隔符,FS適用於awk腳本比較復雜的時候. - END 代碼塊: 格式: END{} 所有輸入處理完成後才去執行!僅僅執行一次! END代碼塊中,awk腳本可以執行一些類似於統計數據、打印輸出之類的操作。 eg. search.awk
  1. BEGIN{ # 初始化信息,便於閱讀
  2. print "How many prople with nologin?"
  3. }
  4. /nologin/{++adder} # 核心awk處理過程
  5. END{ # 掃尾工作,打印結果
  6. print "'nologin' appears " adder " times."
  7. }
  1. awk -f search.awk /etc/passwd
- awk的模式匹配 針對BEGIN和END之間的第二部分的核心處理過程而言,只對匹配上的數據做處理! 語法: /正則表達式/ {匹配後的操作} awk首先用正則表達式去匹配數據記錄,如果匹配上,才執行後面{}內的操作。 eg.1
  1. awk '/^$/{print "This is an empty line."}'/etc/inittab # 匹配空行一次執行一次輸出
eg.2 shell_recorder.wak
  1. BEGIN{
  2. print "SHELL USAGE:"
  3. }
  4. /bash/{++bash} //
  5. /nologin/{++nologin}
  6. END{
  7. print "We have " bash " bash users."
  8. print "We have " nologin " nologin users."
  9. }
  1. awk -f shell_recorder.awk /etc/passwd
awk變量 有兩種: 用戶自定義變量 、內建變量 - awk和絕大多數腳本語言一樣,變量使用無需先聲明,awk會在第一次使用該變量的時候自動建立變量。 - awk的變量建立時初始值都是空字符串,但是在需要數值時,它會被視為0。即awk會自動將字符串轉換為數值進行計算。 在這一點上,awk的行為和shell腳本是一樣的。大多數腳本是語言的行為都是這樣:變量值存儲字符串,當需要時再轉換為為其他類型。 命名規則: awk的變量名必須以ASCII字母下劃線開始,然後選擇性的接上字母、數字、下劃線。 - 如果用正則表達式來匹配變量名的話,awk的變量名必須匹配[A-Za-z_][A-Za-z_0-9]* 命名建議: 局部變量小寫,全局變量第一個字母大寫,內建變量全部大寫 awk 的常見內建變量 F-field字段,域 R-record記錄 S-sign符號 N-number數字 變量 說明 FILENAME 當前輸入文件的名稱 FNR 當前輸入文件的記錄數 NR 工作中的記錄數(行數) NF 一條記錄的字段數(列數) FS 字段分隔符(支持正則),默認空格 OFS 輸出字段分隔符 RS 輸入記錄分隔符,默認換行 ORS 輸出記錄分隔符
awk數組 和awk變量一樣,無需聲明就能使用。 命名規則:和變量名的命名規則相同:[a-zA-Z_][a-zA-Z_0-9]* 數組元素的引用: awk支持在數組名之後,以方括號將任意數字或字符串表達式擴起來作為引用數組的下標(索引)。其他語言要求數組的下標必須是數字。 eg. site[google] = "http://www.google.com" site[yahoo] = "http://yahoo.com" (類似於鍵值對的形式,key是下標,value是數組元素) awk這種能以任意值作為數組的索引(下標)的數組,稱為關聯數組,因為他們的名稱是與值相關聯的。 - awk 支持數組的查找、插入、刪除操作。 - awk數組的存儲空間在引用新元素時會自動增長。 - awk數組的存儲空間是稀疏的,插入了第一個元素array[1]後,可直接插入array[1000],不用填滿2-999之間的數組元素。 - awk數組的元素值可以為任意類型,無類型限制。 總計:awk數組更像是一系列鍵值對的集合,只不過打上了數組的標簽。 數組的元素的刪除: delete array[index] //刪除數組的某一個元素 delete array //刪除數組所有元素 系統環境變量 awk支持訪問linux系統環境變量,通過ENVIRON數組 eg. awk 'BEGIN{print ENVIRON["HOME"]; print ENVIRON["PATH"]}' // 有兩個索引是:ENVIRON["HOME"]、ENVIRON["HOME"]。 awk在啟動時會從系統讀取環境變量對數組ENVIRON進行初始化,可以對這個數組進行加入、刪除以及修改。 算術運算和運算符 - 算術運算 awk中直接進行算術運算, 支持直接進行算術運算的運算符只有: +(加) -(減) *(乘) /(除) %(取模、求余) ^(冪次方), 例如:
  1. awk 'BEGIN {print "(3+2)*7=" (3+2)*7}'
  2. (3+2)*7=35
  3. awk 'BEGIN {print "3^10=" 3^10}'
  4. 3^10=59049
% 是取模運算,表達式 x%y 中,運算結果是x%y的余數。當x能被y整除時,結果為0。 例如:判斷閏年 year.txt
  1. 1936圖靈提出人類歷史上第一個人工智能的概念
  2. 1946世界上第一台計算機"埃尼阿克(ENIAC)"在美國賓西法尼亞大學誕生
  3. 1956第二代計算機產生
  4. 1969Ken.ThompsoDernis.Ritchie發布第一版Unix
  5. 1979 AT&T從各大學收回Unix版權,此後誕生了System V 和 BSD 兩個版本線的Unix操作系統
  6. 1983RichardStallman創建GNU(GNU is not Unix.),1983-1991年GNU三大軟件:Bash shell、gcc、emacs.
  7. 1991LinusTorvalds發布Linux內核
  8. 1994Lins加入GNU,GNU系列軟件與Linux內核結合,退出linus's minix,簡稱Linux.
leap.awk
  1. # awk 腳本求閏年
  2. BEGIN {
  3. print "Pick leap years:"
  4. }
  5. {
  6. # $1為記錄的第一個字段
  7. year=$1
  8. if(( year %4==0&& year %100!=0)||year %400==0)
  9. print year "is a leap year."
  10. else
  11. print year "is not a leap year."
  12. }
  13. END {
  14. print "Checking is over."
  15. }
awk -f leap.awk year.txt
  1. Pick leap years:
  2. 1936is a leap year.
  3. 1946is not a leap year.
  4. 1956is a leap year.
  5. 1969is not a leap year.
  6. 1979is not a leap year.
  7. 1983is not a leap year.
  8. 1991is not a leap year.
  9. 1994is not a leap year.
  10. 1995is not a leap year.
  11. 2016is a leap year.
  12. Checking is over.
- awk運算符
  1. =+=-=*=/=^=**= 賦值 # **= 等價於^=
  2. ?: c條件表達式 # 三目運算符,用法:x>y?x:y 若x>y,則返回x,否則,返回y
  3. || 邏輯或
  4. && 邏輯與
  5. ~ ~! 匹配正則表達式不匹配正則表達式
  6. <<=>>=!=== 關系運算符
  7. 空格 連接
  8. +- 加減
  9. */% 乘除求余
  10. ^ 求冪
  11. ++-- 自加自減
  12. $ 引用字段
  13. in 數組成員
  14. +-! 一元加、減和邏輯非

Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm

Linux系統之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文本處理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm

AWK入門基礎教程 http://www.linuxidc.com/Linux/2016-12/138138.htm

使用awk格式化輸出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm

Copyright © Linux教程網 All Rights Reserved