awk

Awk是一種處理結構數據並輸出格式化結果的編程語言, Awk 是其作者 "Aho,Weinberger,Kernighan" 的簡稱。

Awk通常被用來進行格式掃描和處理。通過掃描一個或多個文件中的行,查看是否匹配指定的正則表達式,並執行相關的操作。

Awk的主要特性包含:

1. Awk以記錄和字段的方式來查看文本文件

2. 和其他編程語言一樣,Awk 包含變量、條件和循環

3. Awk能夠進行運算和字符串操作

4. Awk能夠生成格式化的報表數據

Awk從一個文件或者標準輸入中讀取數據,並輸出結果到標準輸出中。

1.  Awk的語法

Shell代碼 複製代碼
  1. Syntax:   
  2.   
  3. awk '/search pattern1/ {Actions}   
  4.      /search pattern2/ {Actions}' file  

在上訴語法中:

1. search pattern是正則表達式

2. Actions 輸出的語法

3. Awk 中可以存在多個正則表達式和多個輸出定義

4. file 輸入文件名

5. 單引號的作用是包裹起來防止shell 截斷

 

2.  Awk的工作方式:

1 Awk 一次讀取文件中的一行

2)對於一行,按照給定的正則表達式的順序進行匹配,如果匹配則執行對應的 Action

3)如果沒有匹配上則不執行任何動作

4)在上訴的語法中, Search Pattern Action 是可選的,但是必須提供其中一個

5)如果 Search Pattern 未提供,則對所有的輸入行執行 Action 操作

6)如果 Action 未提供,則默認打印出該行的數據

7 {} 這種 Action 不做任何事情,和未提供的 Action 的工作方式不一樣

8 Action 中的語句應該使用分號分隔

創建一個包含下面內容的文本文件employee.txt 。後續的例子中將會用到該文件

Shell代碼
  1. $cat employee.txt   
  2. 100  Thomas  Manager    Sales       $5,000  
  3. 200  Jason   Developer  Technology  $5,500  
  4. 300  Sanjay  Sysadmin   Technology  $7,000  
  5. 400  Nisha   Manager    Marketing   $9,500  
  6. 500  Randy   DBA        Technology  $6,000  

3.  Awk 的默認行爲

默認的時候awk 打印文件中的每一行

Shell代碼
  1. $ awk '{print;}' employee.txt   
  2. 100  Thomas  Manager    Sales       $5,000  
  3. 200  Jason   Developer  Technology  $5,500  
  4. 300  Sanjay  Sysadmin   Technology  $7,000  
  5. 400  Nisha   Manager    Marketing   $9,500  
  6. 500  Randy   DBA      Technology  $6,000  

在上面的例子中,匹配的正則表達式未給出,因此後續的Action 適用所有的行, Action 中的 print 沒有任何參數的情況下將打印整行,注意其中的 Action 必須使用 {} 括起來。

4.  Awk打印匹配的行

Shell代碼
  1. $ awk '/Thomas/   
  2. > /Nisha/' employee.txt   
  3. 100  Thomas  Manager    Sales       $5,000  
  4. 400  Nisha   Manager    Marketing   $9,500  

 

在上面的例子中,將打印包含Thomas Nisha 的行,上面的列子包含兩個正則表達式。 Awk 可以接受任意數量的正則表達式,但是每個組合 ( 正則表達式和對應的 Action) 必須用新行來分隔。

5.  Awk僅打印指定的域

Awk包含許多內建的變量,對於每行的記錄, Awk 默認按照空格進行分割,並將分隔後的值存入對應的 $n 變量中。如果一行還有 4 個單詞,將被分別存儲進 $1 $2 $3 $4 中,其中 $0 代表整行。 NF 也是一個內建的變量,代表該行中分割後的變量數。

Shell代碼
  1. $ awk '{print $2,$5;}' employee.txt   
  2. Thomas $5,000  
  3. Jason $5,500  
  4. Sanjay $7,000  
  5. Nisha $9,500  
  6. Randy $6,000  
  7. $ awk '{print $2,$NF;}' employee.txt   
  8. Thomas $5,000  
  9. Jason $5,500  
  10. Sanjay $7,000  
  11. Nisha $9,500  
  12. Randy $6,000  

在上訴例子中$2 $5 分別代表名字和薪水,也可以使用 $NF 獲得薪水,其中 $NF 代表最後一個字段,在打印語句中逗號是一個連接符號。

6.  Awk開始和最後的動作

Awk包含兩個重要的關鍵字 BEGIN END

 

Shell代碼 複製代碼
  1. Syntax:    
  2.   
  3. BEGIN { Actions}   
  4. {ACTION} # Action for everyline in a file   
  5. END { Actions }   
  6. # Awk中的註釋  

BEGIN 節中的 Actions 會在讀取文件中的行之前被執行。

END 節中的 Actions 會在讀取並處理文件中的所有行後被執行。

 

Shell代碼 複製代碼
  1. $ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}   
  2. > {print $2,"\t",$3,"\t",$4,"\t",$NF;}   
  3. > END{print "Report Generated\n--------------";   
  4. > }' employee.txt   
  5. Name Designation Department Salary   
  6. Thomas   Manager   Sales           $5,000  
  7. Jason   Developer   Technology   $5,500  
  8. Sanjay   Sysadmin   Technology   $7,000  
  9. Nisha   Manager   Marketing   $9,500  
  10. Randy   DBA     Technology   $6,000  
  11. Report Generated   
  12. --------------  

上述的例子爲輸出結果增加頭和尾描述

7.  Awk找出員工 ID 大於 200 的員工

 

Shell代碼
  1. $ awk '$1 >200' employee.txt   
  2. 300  Sanjay  Sysadmin   Technology  $7,000  
  3. 400  Nisha   Manager    Marketing   $9,500  
  4. 500  Randy   DBA        Technology  $6,000  

在上述例子中,$1 代表員工 ID ,如果員工 ID 大於 200 則執行默認的打印整行的 Action

8.  Awk打印技術部員工

$4代表員工所在的部門,如果等於 Technology 則打印出整行

 

Shell代碼
  1. $ awk '$4 ~/Technology/' employee.txt   
  2. 200  Jason   Developer  Technology  $5,500  
  3. 300  Sanjay  Sysadmin   Technology  $7,000  
  4. 500  Randy   DBA      Technology  $6,000  

~操作符是和正則表達式中的值進行比較,如果匹配則打印整行

9.  Awk打印技術部門的員工數

在下面的例子中,檢查員工的部門是否是Technology ,如果是則遞增 count 變量的值。 Count 變量的值在 BEGIN Actions 中被初始化爲 0

 

Shell代碼
  1. $ awk 'BEGIN { count=0;}   
  2. $4 ~ /Technology/ { count++; }   
  3. END { print "Number of employees in Technology Dept =",count;}' employee.txt   
  4. Number of employees in Tehcnology Dept = 3  

在處理的最後(END Actions) ,僅僅打印出 Technology 部門的人數

http://zhouzaibao.javaeye.com/blog/664909

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章