Linux常用命令之awk命令

-----------awk命令-----------
說明:
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。

有三種方式調用awk

1.命令行方式

awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱爲一個域。
通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。

2.shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作爲腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
格式爲: ./awk腳本文件 輸入文件

3.插入文件方式
將所有的awk命令插入一個單獨文件,然後調用:

awk -f awk-script-file input-file(s)
awk -f awk腳本文件 輸入文件
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。

awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。

  • ARGC 命令行參數個數
  • ARGV 命令行參數排列
  • ENVIRON 支持隊列中系統環境變量的使用
  • FILENAME awk瀏覽的文件名
  • FNR 瀏覽文件的記錄數
  • FS 設置輸入域分隔符,等價於命令行 -F選項
  • NF 瀏覽記錄的域的個數
  • NR 已讀的記錄數
  • OFS 輸出域分隔符
  • ORS 輸出記錄分隔符
  • RS 控制記錄分隔符

例:

last -n 5    |awk '{print $1}'      
#顯示最近登錄的5個賬號。

cat /etc/passwd |awk -F ':' '{print $1}'        
#顯示/etc/passwd的賬戶。

cat /etc/passwd |awk -F ':' '{print $1 "\t" $7}' 
#顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割。

cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1 "," $7} END{print "這裏結束了"}'        
#只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,
#而且在所有行添加列名name,shell,在最後一行打印“這裏結束了”。

awk -F: '/root/' /etc/passwd  
#搜索/etc/passwd有root關鍵字的所有行。

awk -F ':' '/root/{print $7}' /etc/passwd
#搜索/etc/passwd有root關鍵字的所有行,並顯示對應的shell。

awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd  
#統計/etc/passwd文件名,每行的行號,每行的列數,對應的完整內容。

awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd        
#使用printf替代print,可以讓代碼更加簡潔,易讀。

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd    
#統計/etc/passwd的賬戶人數,count是自定義變量。

awk 'BEGIN {count=0;print "start usr count is ", count} {count=count+1;print $0;} END{print "end user count is", count }' /etc/passwd    
#初始化count,雖然默認是0,但是妥當的做法還是初始化爲0。

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "end size is ", size}'  
#統計某個文件夾下的文件佔用的字節數。

ls -l |awk 'BEGIN {size=0;} {size=size + $5;} END{print "end size is", size/1024/1024 "M"}'   
#同上,以M爲單位顯示;注意,統計不包括文件夾的子目錄。

awk -F ':' 'BEGIN {count=0;} {name[count] = $1; count++;}; END{for(i=0; i < NR; i++) print i, name[i]}' /etc/passwd      #顯示/etc/passwd的賬戶。

awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt    
#第一個段匹配root的行,並以#作爲分隔符輸出結果。

awk -F ':' '$1=="root" || NR>20 {OFS="#";print $1,$2}' 1.txt     
#匹配root或者行號大於20的行的結果。

awk -F ':' '$1=$3+$4 {print}' 1.txt        
#把第一段用第3和第4段的和的結果表示,並打印出全部結果。

awk -F ':' 'NF >3 && NF<10 {print}' 1.txt  
#顯示分段數量在3-10之間的結果。

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