Linux三劍客(grep sed awk) 之 awk

awk

awk****推薦去看朱雙印的博客“awk****從放棄到入門”,寫的真的很好,本文的awk****就總結于它。

awk其實是一門編程語音,它支持條件判斷、數組、循環(huán)等功能。所以,我們也可以把awk理解成一個腳本語言解釋器

1、awk基礎

1.1、普通模式

awk 【option】 ‘program’ file1,file2

image.png

1.2、特殊模式

image.png

1) BEGIN和END模塊只能有一個。中間的pattern匹配,可以有多個

NR==2{print 1}NR==5{print1}

2) BEGIN模塊,代表awk在處理文本前要做的事。即使不接收文件名,僅僅使用BEGIN模塊打印,也能正常輸出

awk ‘BEGIN {print “111”,”222”}’

3) END模塊,代表awk在處理文本后要做的事

awk ‘{print 1,2} END{print ‘333’,’444’}’test

1.3、內置變量

image.png
image.png

1.4、自定義變量

awk除了使用內置變量,還可以自己定義變量。

方法一:-v varname=value 變量名區(qū)分字符大小寫。-v:設置變量

方法二:在program中定義

1****、-v ****定義

image.png

2****、在program****定義

image.png

2、printf

awk本身負責文本切割,printf動作則負責格式格式化文本。在了解awk的printf動作前,需要首先了解printf命令

2.1、shell的printf命令

在shell中,echo和printf都是輸出文本的命令。echo輸出的字符串,會自動在末尾加上\n,

而printf不會。printf的作用是按照我們指定的格式輸出文本,所以\n,也需要我們自己指定

echo與printf

image.png

注意看3,printf的優(yōu)勢就在于,可以用格式替換符,幫我們處理一長串的str

替換符號

格式替換符
image.png
轉義字符
image.png
修飾符
image.png

“.5”表示整數的長度,不足用0補齊

例子
image.png
image

2.2、awk的printf動作

awk的printf動作與shell的printf命令很像,只是要注意幾點:

1) 使用printf動作輸出的文本不會換行,要自己手動加\n

2) 使用printf動作時,“指定的格式”與“被格式化的文本”間,要用“逗號”隔開

3) 使用printf動作,“格式替換符”與“被格式化的文本”數量一一對應

例子

image.png

awk -v FS=':' 'BEGIN{printf "%-10s\t %s\n","用戶名稱","用戶ID"} {printf "%-10s\t %s\n",1,3}' /etc/passwd

用戶名稱 用戶ID

root 0

bin 1

3、awk模式(Pattern)

3.1、grep與awk的正則對比

grep ‘^root’/etc/passwd

awk ‘/^root/{print $0}’ /etc/passwd

image.png
image.png
image

3.2、awk正則的注意點

1)awk命令中的正則是“擴展正則表達式”

2)當使用{x,y}或[[:space]],這種正則時,要加上參數—posix

3)注意對“\”和“.”轉義

3.3、awk的行范圍模式

image.png

兩個正則的就是行范圍模式,從正則1匹配的行開始,到正則2匹配的行結束

正則匹配符

image.png

3.4、例子

image.png
image

4、awk動作總結

4.0、動作拆分

image.png

上圖的動作分為兩個部分:

1) 紅線標注:最外側的括號“{}”?!敖M合語句”類型的動作,將多個代碼組合成代碼塊

2) 藍線標注:“print $0”。print是“輸出語句”類型的動作

例子

image.png
image

4.1、if動作

image.png

如果if對應的{},只有一條命令,可以省略{}

4.2、for動作

image.png

4.3、while動作

image.png

4.4、do…while動作

do…while循環(huán)無論是否滿足while的條件,都會先執(zhí)行一次do里的命令

打印一遍test

image.png

打印5遍test

image.png

4.5、cotinue和break

1~5,不打印3

image.png

打印1~3

image.png

4.6、exit

awk中,exit表示跳過后序所有動作,直接執(zhí)行END內的命令。如果沒有END模式,則會直接結束awk命令

只打印1

image.png

不會打印$0

image.png

4.7、next

next的作用是跳過當前行。直接從下一行 開始處理

跳過第2行

image.png

5、awk數組

5.1、基礎概念

1)awk中的數組是一個使用字符串作為下標的“關聯數組”。

2)我們在使用時,可以用 數字/字符串 作為下標,不過使用數字作為下標時,awk默認會把“數字”下標轉換為“字符串”。

3)在awk中,元素的值可以設置為“空”。

4)當一個元素不存在于數組時,如果我們直接引用這個不存在的元素,awk會自動創(chuàng)建這個元素,并且默認為這個元素賦值為“空字符串”

5)在awk中,判斷數組中元素是否存在,用“if(下標 in 數組名)”。即判斷數組中是否有key

6)使用split函數生成的數組,下標默認是從1開始的

5.2、基本操作

創(chuàng)建數組,直接創(chuàng)建就可以

image.png

刪除數組中的元素

awk ‘BEGIN{ …;delete huluwa[0]}’

刪除整個數組

awk ‘BEGIN{ …;delete huluwa}’

for循環(huán)有序遍歷數組。只有下標是數字時,通過下標的遞增,才能有序遍歷

awk ‘BEGIN{ …;for (i=1;i<=3;i++){print i,huluwa[i];} }’

for循環(huán)無序遍歷數組。因為awk數組本身是無序的關聯數組

awk ‘BEGIN{ …;for (i in huluwa){print i,huluwa[i]} }’

實例應用——統計某文件$1 重復出現的次數

awk ‘{count[$1]++} END{ for (i in count ) {print i,count[i]} }’ file

實例應用——統計某文本人名出現次數

awk ‘{ for (i=1;i<=NF;i++) {count[$i]++} } END{ for (a in count) {print a,count[a]} }’

6、awk內置函數

6.1、算術函數

rand函數,srand函數,int函數

rand函數固定打印了0.237788,srand函數固定打印1,兩者合用,可生成小于1的隨機數

rand函數

awk 'BEGIN{print rand()}'

0.237788

srand函數

awk 'BEGIN{print srand()}'

1

生成小于1的隨機數

awk 'BEGIN{srand();print rand()}'

0.319498

通過隨機數乘100,在通過int函數取整,生成0~100間的隨機數

awk 'BEGIN{srand();print int(100*rand())}'

76

6.2、字符串函數

gsub函數,sub函數

這兩個函數用于替換某些 文本

awk ‘{ gsub (“old”,“new”,1);print0}’file

awk ‘{ gsub (“[a-z]”,“new”,1);print0}’file

gsub將指定范圍內匹配的字符全部替換為新字符

sub用法與gsub一樣,但只替換匹配范圍內第一次匹配到的字符

比如某文件就一行,$1=aaa。

gsub(“a”,“b”),則1=bbb。第三個參數不加,則默認為0

sub(“a”,“b”),則$1=baa。

length函數

length函數可獲取指定字符串的長度。不指定參數,默認為$0

awk ‘{ for (i=1;i<=NF;i++) {print i,length(i)} }’file

index函數

獲取指定字符串位于整個字符串中的位置

awk ‘{print index($0,“LEE”)}’file

0

7

0

index函數在每一行中查找LEE,如果該行沒有,返回0,該行有,返回位置

split函數

split函數可以切割字符串,幫我們動態(tài)生成數組。生成的數組下標從1開始

將ts以“;”分隔,并將分隔后的str保存到huluwa數組中

awk –v ts=”one;two;three”‘BEGIN{ print split(ts,huluwa,”;”)}’

split函數的返回值就是數組長度

split(ts,huluwa,”;”) == 3

6.3、排序函數

asort函數

asort函數根據數組的value值進行排序

asort排序后,原有key將被數字替代

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35 ; asort(t) ; for (i in t){print i,t[i]} }'

1 35

2 66

3 88

asort排序時,新建一個數組。t[]不變,新創(chuàng)了new[]

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35 ; asort(t,new) ; \

for (i in new){print i,new[i]} }'

asort函數的返回值就是數組的長度

asort(t,new)==3

asorti函數

asorti函數會對原數組的key排序,然后將key作為value生成一個新數組

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35;asorti(t,new);for (i in new){print i,new[i]} }'

1 a

2 b

3 c

通過asorti排列原數組

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35;asorti(t,new);\

for (i in new){print i,new[i],t[new[i]] } }'

1 a 66

2 b 88

3 c 35

7、三元運算與打印奇偶行

7.1、三元運算

if…else判斷用戶類型

awk –F : ‘{ if($3<500){usertype=“系統用戶”}else{ usertype=“普通用戶”};\

print $1,usertype }’/etc/passwd

三元運算符替換if…else

awk –F : ‘{ usertype=$3<500?“系統用戶”: “普通用戶”;\

print $1,usertype }’/etc/passwd

l $3<500:條件判斷

l ?”系統用戶”:為真,則“系統用戶”賦給usertype

l :“普通用戶”:為假,則“普通用戶”賦給usertype

三元運算符統計“系統用戶”和“普通用戶”數量

awk -F: '{$3<500?a++:b++}END{print a,b}' /etc/passwd

7.2、打印奇偶行

打印奇數行

awk ‘a=!a’flie

打印偶數行

awk ‘!(a=!a)’flie

解析:

我們知道awk的正則匹配是

image.png

/

但如果我們不加print動作,僅僅有正則,那么會默認打印$0。

awk ‘/正則/’file

而在awk中,非0/非空str表示“真”。0/空表示“假”

注意,這不是正則,‘2’不為0/空,打印file所有

awk '2' file

所以’a=!a’

1) a沒有定義,初始化a=‘’,a為“假”

2) !a為“真”

3) a=!a,a變?yōu)椤罢妗?,打印?行

4) !a又變?yōu)椤凹佟?,不打印?行

‘!(a=!a)’

1)a=!a為真,!(a=!a)為假,不打印 第1行

2)a=!a為假,!(a=!a)為真,打印第2行

8、參考文檔

awk從放棄到入門 (http://www.zsythink.net/?s=awk)

awk用法(使用入門) (https://www.cnblogs.com/emanlee/p/3327576.html)

官方文檔 (https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents)

原文 : http://blog.51cto.com/12758568/2122677

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載 原文的排版和內容都更加友好,并且詳細,我只是在這里貼出了一部分留作自己以后參考和學習,如希望更詳細了解AWK...
    XKirk閱讀 3,362評論 2 25
  • Linux指令中文說明傳送入口 整理自Linux指令中文說明 文本和數據進行處理的編程語言awk 是一種編程語言,...
    釋閑人閱讀 2,369評論 1 6
  • 本章主要學習內容awk介紹 ?awk基本用法 ?awk變量 ?awk格式化 ?awk操作符 ?awk條件判斷 ?a...
    楠人幫閱讀 1,368評論 0 8
  • awk:報告生成器,格式化文本輸出 內容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,551評論 0 9
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,992評論 0 2

友情鏈接更多精彩內容