歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

awk-基本語法知識

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. print "USER: " $1 "\tSHELL: " $7
  5. }
  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