【shell】shell腳本實戰-awk工做模式講解


文章目錄

    • 3) 顯示用戶信息配置文件中uid大於500的用戶名及uid信息並在開頭顯示「用戶名 UID」字樣,在結尾顯示「the over"
    • 1) 給文件結尾 添加信息
    • 2) 統計 /etc/services 文件中的空行的數量
    • 1. awk 腳本擁有的形式
    • 2. 正則表達式
    • 3. 關係表達式
    • 4. 組合的Pattern(模式)
    • 5. Pattern1,Pattern2
    • 6. BEGIN
    • a) 給文件開頭添加信息
    • b) 取eth0的ip地址
    • awk工做的三個步驟
    • awk中的各類模式詳解
    • 7. END


awk工做的三個步驟

  • 讀:從文件、管道或標準輸入中讀入一行而後把它存放到內存中
  • 執行:對每一行數據,根據AWK命令按順序執行。默認狀況是處理每一行數據,也能夠指定模式
  • 重複:一直重複上述兩個過程直到文件結束

awk中的各類模式詳解

1. awk 腳本擁有的形式
awk  '/pattern/ { actions }' filename

你一般會發現腳本中的模式(/pattern/)是一個正則表達式,此外,你也能夠在這裏用特殊模式 BEGIN 和 END。所以,咱們也能按照下面的形式編寫一條 awk 命令:mysql

awk 'BEGIN { actions } /pattern/ { actions } /pattern/ { actions }...END { actions }' filenames

語法結構以下圖:
在這裏插入圖片描述
其中:BEGIN END是AWK的關鍵字部,所以必須大寫;這兩個部分開始塊和結束塊是可選的正則表達式

特殊模塊:
BEGIN語句設置計數和打印頭部信息,在任何動做以前進行
END 語句輸出統計結果,在完成動做以後執行sql

awk經過Pattern(模式)來控制是否處理當前記錄,若是當前記錄和Pattern匹配,則執行Action(操做)。在awk中,有下列幾種模式:數組

一、正則表達式
二、關係表達式
三、組合的Pattern
四、Pattern1,Pattern2
五、BEGIN
六、END

爲了說明以上各類模式,咱們這裏準備一個文件score.txt,以實例的方式一一進行說明,score.txt文件內容以下:ide

[root@ecs-c13b awk]# cat score.txt guojing 85 92 78
zhaoyun 89 90 75
sanfeng 84 88 80
guanyu 83 78 90
liubei 86 88 79

2. 正則表達式
  • 查詢有一門課程成績在90-99區間的學習的成績。
[root@ecs-c13b awk]# awk '/9[0-9]/ {print $0}' score.txt guojing 85 92 78
zhaoyun 89 90 75
guanyu 83 78 90

以上指令查詢有一門課成績在[90-99]區間的學生的成績信息,/9[0-9]/部分即爲awk程序指令中的Pattern,這裏Pattern的類型爲正則表達式。學習

awk '$3 ~ /9[0-9]/ {print $0}' score.txt

zhaosan 85 92 78
lisheng 89 90 75

這條指令在上一條指令的基礎上增長了限制,須要第二門課(數學)成績在[90-99]區間纔可與模式匹配。這裏的 ~ 操做符用來表示變量是否與正則表達式匹配,若是要判斷不匹配,可使用 !~ 操做符。測試

3. 關係表達式
awk '$3 >= 90 {print $0}' score.txt

zhaosan 85 92 78
lisheng 89 90 75

可用來造成模式關係運算符包括: <(小於)、>(大於)、<=(小於或等於)、>=(大於或等於)、= =(等於)和 ! =(不等於)。ui

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

4. 組合的Pattern(模式)
awk '$3 >= 90 && $3 < 100 {print $0}' score.txt

zhaosan 85 92 78
lisheng 89 90 75

布爾運算符 ||(或)&&(和)以及 !(不)將模式組合,組合後若是求值爲真則模式匹配,不然不匹配。這裏就解決了關係表達式示例中包含了100的問題。excel

5. Pattern1,Pattern2
awk 'FNR == 2 , FNR == 4 {print $0}' score.txt

lisheng 89 90 75
zhaoyun 84 88 80
guanyu 83 78 90

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

6. BEGIN

BEGIN模塊在awk讀取文件以前就執行,通常用來定義咱們的內置變量(預約義變量,eg:FS,RS)能夠輸出表頭(excel表格名稱)

BEGIN模式以前在實例中提到,自定義變量,給內容變量賦值等,都是使用過。須要注意的是BEGIN模式後面要結合一個action操做塊,包含在大括號內。

awk必須在對輸入文件進行任何處理前先執行BEGIN定義的action操做塊。咱們能夠不要任何輸入文件,就能夠對BEGIN模塊進行測試,由於awk須要先執行完BEGIN模式,纔對輸入文件作處理。BEGIN模式經常被用來修改內置變量ORS,RS,FS,OFS,等的值。

a) 給文件開頭添加信息

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

awk 'BEGIN { print "Print student score table"} {print $0}' score.txt

Print student score table
zhaosan 85 92 78
lisheng 89 90 75
zhaoyun 84 88 80
guanyu 83 78 90
liubei 86 88 79

b) 取eth0的ip地址
ifconfig eth0|awk -F '(addr:)|(Bcast:)' 'NR==2{print $2}'ifconfig eth0|awk -F '[: ]+' 'NR==2{print $4}'ifconfig eth0|awk -F '[^0-9.]+' 'NR==2{print $2}'

也能夠寫成

ifconfig eth0|awk  'BEGIN{FS="(addr:)|(Bcast:)"} NR==2{print $2}'ifconfig eth0|awk  'BEGIN{FS="[^0-9.]+"} NR==2{print $2}'ifconfig eth0|awk  'BEGIN{FS="[: ]+"} NR==2{print $4}'

注意:命令行 -F 本質就是修改FS的變量。

7. END

END 在awk讀取完全部的文件的時候,再執行END模塊,通常用來輸出一個結果(累加,數組的結果)也能夠是和BEGIN模塊相似的結尾標識信息。

1) 給文件結尾 添加信息
awk 'END { print "Work done"} {print $0}' score.txt

zhaosan 85 92 78
lisheng 89 90 75
zhaoyun 84 88 80
guanyu 83 78 90
liubei 86 88 79
Work done

2) 統計 /etc/services 文件中的空行的數量

統計數量: grep -c 或 awk

[root@mysql-master ~]# awk '/^$/{print $0}' /etc/services |wc -l16[root@mysql-master ~]# grep -c '^$' /etc/services16[root@mysql-master ~]# awk '/^$/{i++}END{print i}' /etc/services16[root@mysql-master ~]# awk '/^$/{i=i+1}END{print i}' /etc/services16

3) 顯示用戶信息配置文件中uid大於500的用戶名及uid信息並在開頭顯示「用戶名 UID」字樣,在結尾顯示「the over"
awk -F: 'BEGIN { print "用戶名 UID"} END { print "the over"} $3>500{print $1,$3}' /etc/passwd

補充:awk中變量使用

直接定義,直接使用便可。

awk中字母會被認爲是變量,若是真的要給一個變量賦值使用雙引號

[root@mysql-master ~]# awk 'BEGIN{ a=123asdf;print a}'    #awk中字母會被認爲是變量123[root@mysql-master ~]# awk 'BEGIN{ a="123asdf";print a}' #awk中給變量賦值要加雙引號;使用變量直接使用便可123asdf
相關文章
相關標籤/搜索