shell-awk

awk基本語法

awk也是一款比較強大的文本處理工具正則表達式

awk是一種強大的文本處理工具,是Linux以及Unix環境中現有的功能最強大的數據處理引擎之一,awk具有一個完美的編程語言應具備的幾乎全部的精美特性,是一種用於處理文本的編程語言工具

awk的用途數據庫

awk用於在文件中查找與模式匹配的行,並在這些行上執行指定的操做!
awk命令利用一組用戶提供的指令來將一組文件和用戶提供的擴展正則表達式比較,一次一行,而後在任何與擴展正則表達式匹配的行上執行操做,若是找不到匹配內容,則繼續處理下一行。
awk命令的模式搜索比grep命令更加經常使用。

記錄和字段編程

awk把輸入流看做一連串記錄的集合,每條記錄又進一步細分爲字段。這裏的記錄和字段,和數據庫中的記錄和字段很是的相似。
記錄是由記錄分隔符RS隔開的一組數據,記錄分隔符的缺省值是換行符,他使文件中的每一行成爲一個單獨的記錄,在awk中,記錄分隔符能夠經過設置awk的內奸變量RS來更改

awk的程序指令模型

awk的兩種形式語法格式:vim

awk [option] 'commands' filename
awk [option] -f awk-script-file filename

一個典型的awk程序指令是由模式(pattern)和大括號括起來的操做(action)組合而成的,具體格式以下:編程語言

pattern {action}

對於awk讀取的每條記錄,若是一個記錄與指定模式(pattern)想匹配,或包含與該模式匹配的字段,那麼執行相應的操做(action)。工具

具體事例看我另外一篇文檔,或者自行百度。spa

awk程序流程介紹

1、自動從輸入讀取一條記錄
2、自動更新相關的內建變量的值,例如:NF,NR,$0等
3、依次執行程序中全部的pattern{action}指令
4、執行完全部的pattern{action}指令後,若從輸入還能夠讀取到數據,則反覆執行1-4步驟
  以上四個步驟的重複復執行,徹底由awk來自動進行,無需使用者編寫這個循環,使用者只須要根據業務需求設計pattern{action}便可

具體案例自行百度,這塊接觸的都是簡單的操做,複雜的目前沒時間學。設計

awk模式匹配

awk總的各類模式詳解code

下面爲awk程序指令的模型,每一個awk程序都是由一些下面的語句組成,從而完成特定的功能:
pattern{action}
awk經過pattern(模式)來控制是否處理當前記錄,若是當前記錄和pattern匹配,則執行action(操做),在awk中,有如下幾種模式:
  1、正則表達式
  2、關係表達式
  3、組合的pattern
  4、pattern1,pattern2
  5、算數表達式
  6、BEGIN
  7、END

案例操做:首先新建一個文件avengers.txt,以實例的方式一一進行說明:blog

[root@localhost test]# vim avengers.txt
[root@localhost test]# cat avengers.txt 
hulk 85 92 78
captain 89 90 75
ironman 84 88 80 
widow 83 78 90
hawkeye 86 88 79
[root@localhost test]# 

這是一個簡單的學生成績表,共五個學生的成績,每條記錄包括:名字,而後是三門課的成績

1.正則表達式,若是使用元字符{}前使用兩個/ "//"裏面使用元字符。

[root@localhost test]# awk '/9[0-9]/ {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
widow 83 78 90
[root@localhost test]# 

指令查詢有一門成績在[90-99]區間的學生的成績信息,這裏pattern的類型爲正則表達式

[root@localhost test]# awk '$3 ~ /9[0-9]/ {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

這條指令在上一條的基礎上增長了限制,須要第二門課在【90-99】區間才能夠與模式匹配,這裏的~表示變量是否採用正則表達式。

2.關係表達式

[root@localhost test]# awk '$3 >= 90 {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

這條指令的做用也是查詢數學成績在90分以上的學生成績信息,不過比正則表達式中的範圍要大(100頁符合)

3.組合的pattern(模式)

[root@localhost test]# awk '$3 >= 90 && $3 < 100 {print $0}' avengers.txt 
hulk 85 92 78
captain 89 90 75
[root@localhost test]# 

布爾運算符 ||(或) &&(和) 以及!(不)將模式組合,組合後若是求值爲真則模式匹配,不然不匹配。

4.pattern1,pattern2

[root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0}' avengers.txt 
captain 89 90 75
ironman 84 88 80 
widow 83 78 90
[root@localhost test]# 

其實這個也能夠歸爲組合的模式總共,只是這種模式比較特殊,全部單獨列出。(逗號)隔開的兩個pattern指定一個範圍,對從匹配的第一個pattern的記錄開始,到匹配第二個pattern結束的全部記錄執行action。

5.算術表達式

[root@localhost test]# awk 'FNR == 2, FNR == 4 {print $0,$2+$3+$4}' avengers.txt 
captain 89 90 75 254
ironman 84 88 80  252
widow 83 78 90 251
[root@localhost test]# 

算數運算包括:+(加),-(減),*(乘),/(除),%(取模)。

6.BEGIN

BEGIN模式是awk的一種特殊的pattern,BEGIN模式指定的操做在讀取任何輸入以前執行,且只執行一次。使用BEGIN模式甚至不須要指定輸入文件,通常把與數據文件內容無關以及只需執行一次的部分置於BEGIN模式爲pattern的action中。

假如咱們要講學生成績表打印出來,那總得加點表頭什麼的吧,就能夠寫在BEGIN中了。

[root@localhost test]# awk 'BEGIN {print "Print student score table"}'
Print student score table
[root@localhost test]# 

7.END

end模式也是awk中一種特殊的pattern,END模式指定的操做在讀取全部的輸入後執行。

[root@localhost test]# awk 'END {print "Work done "}' avengers.txt 
Work done 
[root@localhost test]# 

 

更多操做請自行百度。目前用到的不是特別多。。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息