文本處理三劍客之awk(報告生成器)

文本處理三劍客之awk(報告生成器)

awk是一款強大的報告生成器,不一樣於sed和grep,它的側重點是如何把文本信息更好的展現出來,經常使用與統計和格式化輸出。awk至關於微型的shell,有着本身一套語法結構,例如:循環結構,數組,條件判斷,函數,內置變量等功能。

awk在我認爲簡直就是文本處理時打劫放火一大利器。 例如取出/etc/passwd中的第一列。 [root@CentOS6 ~]# awk -F: '{print $1}' /etc/passwd root bin daemon adm ...
經常使用選項
選項 參數 說明
-F 指明輸入時用到的字段分隔符 若是不指定默認表明用正則表達式匹配多個空白字符
-v var=value: 自定義變量  

 

變量 介紹 說明
FS 輸入字段分隔符,默認爲空白 同-F效果同樣
OFS 輸出字段分隔符,默認爲空白字符 ‘{print $1,OFS,$2}’
RS 輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效  
ORS 輸出記錄分隔符,輸出時用指定符號代替換行符  
NF 字段數量  
NR 行號  
FNR 各文件分別計數,行號 awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME 當前文件名  
ARGC 命令行參數個數  
ARGV 數組,保存的是命令行所給定的各參數  

 

格式化輸出參數 介紹
%c 顯示字符的ASCII碼
%d, %i: 顯示十進制整數
%e, %E 顯示科學計數法數值
%f 顯示爲浮點數
%g, %G 以科學計數法或浮點形式顯示數值
%s 顯示字符串
%u 無符號整數
%% 顯示% 自身
#[.#] 第一個數字控制顯示的寬度;第二個# 表示小數點後精度,%3.1f
基本結構

awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...linux

awk 程序一般由:BEGIN語句塊(最初執行)、被模式匹配的語句塊(中間執行)、END語句塊三部分構成(最後執行)。program一般被單引號或雙引號引中。不必定每種模式必定要用,pattern會最經常使用到 。正則表達式

基本格式
print標準輸出 printf 格式化輸出

printshell

   須要顯示的內容逗號分割,支持字符串、數值、當前記錄的字段、變量或者awk的表達式。express

 

 awk -F: '{print $1,$3}' /etc/passwd($0表明整行) awk -F: '{print length($1),$1}' /etc/passwd 打印$1的字符數量 以及顯示$1
awk -F: 'i=1;j=1{print i,j}' /etc/passwd 請注意這裏有個坑,寫以前想下會是什麼結果,看打印出來和本身想的是否是同樣

printf編程

  不會自動換行 須要制定換行控制符 「\n」
  須要指定格式,使看起來更簡潔

[root@station38 testscr]# awk -F: '{printf "%-20s%s\t%s\n",$1,$2,$3}' /etc/passwd 數組

root x 0 tcp

bin x 1 函數

bin x 1 性能

bin x 1 測試

.....

邏輯操做符和算術運算符

 

算術運算支持賦值、算術運算、算術比較、模式匹配,支持正則。
邏輯操做符理論上最好只有一個&&或者|| 這樣可視性強

 

   awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd    awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
BEGIN/END 模式
awk -F: 'BEGIN{print "AAAAAAAA"}{printf "%-15s%-20d\n",$1,$3}END{print "BBBBBBBB"}' /etc/passwd AAAAAAAA root 0 bin 1 bin 1 bin 1 ... BBBBBBBB  先執行BEGING,而後讀取文件,讀入有/n換行符分割的一條記錄,而後將記錄按指定的域分隔符劃分域,填充域,$0則表示全部域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動做action。接着開始讀入第二條記錄······直到全部的記錄都讀完,最後執行END操做。
性能比較time
測試計算100之內3的倍數相加得數 顯示耗時 
[root@station38 testscr]# time (seq -s + 3 3 100|bc) 1683 real 0m0.015s user 0m0.008s sys 0m0.006s
條件表達式(三目表達式)
selector?if-true-expression:if-false-expression 若是以前的條件爲真執行以前的條件,若是以前的條件爲假則執行最後的條件.
最後一個字段($NF)不等於 /sbin/nologin 爲真,執行name="sysuser" ,在執行最後的條件。 awk -F: '$NF != "/sbin/nologin"?name="sysuser":name="user"{printf "%-20s:%s\n",$1,$3}' /etc/passwd
鏈接當前主機次數前三的IP
netstat -nt | awk '/^tcp/{print $(NF-1)}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n3 訪問太過頻繁有危險扔黑名單 例如是 192.168.22.129的IP iptables -A INPUT -s 192.168.22.129 -p tcp --dport 80 -j REJECT
條件語句和shell腳本編程裏類型同樣的,只不過這個不換行,並且使用括號的方式更相似C語言。接下來舉兩個例子
查看用戶屬因而普通用戶仍是系統用戶。 [root@station38 testscr]# awk -F: '{print $3,$4}' /etc/passwd | awk '{i=1;while(i<=NF){if($i<500)print $i,"smaller";else print $i,"bigger";i++}}' 0 smaller 0 smaller 993 bigger 113 smaller 113 smaller 995 bigger 992 bigger ...... 打印UUID 開頭的行的每段有多少字符 [root@station38 testscr]# awk '/^UUID/{i=1;while(i<=NF){print length($i);i++}}' /etc/fstab 41 1 4 8 1 1 41 ...... 找到/etc/grub2.cfg中開頭能夠有空白字符的行 後面跟linux16的行 顯示而且顯示有多少字符 [root@station38 testscr]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10)print $i,length($i);i++}}' /etc/grub2.cfg /vmlinuz-3.10.0-327.el7.x86_64 30 root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46 crashkernel=auto 16 ...... do-while的用法 while是條件爲真執行循環,do是無論真假先執行一次。這是惟一的區別 [root@station38 testscr]# awk '/^[[:space:]]*linux16/{i=1;do{print $i,length($i);i++}while(i<=NF)}' /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-327.el7.x86_64 30 root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 LANG=en_US.UTF-8 16 ...... 使用awk while循環實現1到100的加法 [root@station38 testscr]# awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}' 5050
相關文章
相關標籤/搜索