三劍客之awk 逐行讀取


目錄:

一、awk工作原理

二、按行輸出文本

三、按字段輸出文本

四、通過管道,雙引號調用shall命令

五、CPU使用率

六、使用awk 統計 httpd 訪問日志中每個客戶端IP的出現次數

 

 

一、awk工作原理

  • 逐行讀取文本,默認以空格或tab鍵為分隔符進行分隔, 將分隔所得的各個字段保存到內建變量中, 並按模式或者條件執行編輯命令。
  • sed命令常用於一整行的處理,而awk比較傾向於將一行分成多個"字段"然后再進行處理。 awk信息的讀入也是逐行讀取的,執行結果可以通過print的功能將字段數據打印顯示。 在使用awk命令的過程中,可以使用邏輯操作符"&s"表示"與"、"J"表示"或"、"!"表示"非";還可以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取余和乘方。

命令格式∶

awk 選項  '模式或條件  {操作)'  文件1 文件2  ...
awk- f  腳本文件  文件1  文件2  ... 

 awk常見的內建變量(可直接用)如下所示

  • FS: 列分割符。指定每行文本的字段分隔符,默認為空格或制表位。與"-F"作用相同
  • NF: 當前處理的行的字段個數
  • NR: 當前處理的行的行號(序數)
  • $0: 當前處理的行的整行內容
  • $n: 當前處理行的第n個字段(第n列)
  • FILENAME: 被處理的文件名
  • RS: 行分隔符。awk從文件.上讀取資料時,將根據RS的定義把資料切割成許多條記錄,而awk-次僅讀入一條記錄,以進行處理。預設值是’\n’

二、按行輸出文本

 

awk '{print}' testfile           #輸出全部內容
awk '{print $0}' testfile       #輸出全部內容

 

 

awk 'NR==1,NR==3{print}' testfile           #輸出第1~3行內容
awk '(NR>=1)&&(NR<=3){print}' testfile     #輸出第1~3行內容

 

 

awk 'NR==1||NR==3{print}' testfile  #輸出第1行、第3行內容

 

 

awk '(NR%2)==1{print}' testfile   #輸出所有奇數行的內容
awk '(NR%2)==0{print}' testfile    #輸出所有偶數行的內容

 

 

awk '/^root/{print}' /etc/passwd     #輸出以root開頭的行
awk '/bash$/{print}' /etc/passwd  #輸出以bash 結尾的行

 

 

awk 'BEGIN {x=0};/bash$/{x++};END{print x}' /etc/passwd    #統計以/bin/bash結尾的行數,等同於grep -c "/bin/bash$" /etc/passwd
BEGIN模式表示,在處理指定的文本之前,需要先執行BEGIN模式中指定的動作; awk再處理指定的文本,之后再執行END模式中指定的動作,END{}語句塊中, 往往會放入打印結果等語句

 

 

 

 

三、按字段輸出文本

awk -F ":" '{print $3}' /etc/passwd   #輸出每行中(以空格或制表位分隔)的第3個字段

 

 

 

awk -F ":" '{print $1,$3}' /etc/passwd   #輸出每行中的第1、3個字段

 

 

awk -F ":" '$3<5{print $1,$3}' /etc/passwd #輸出第3個字段的值小於5的第1、3個字段內容

 

 

awk -F ":" '!($3<200){print}' /etc/passwd  #輸出第3個字段的值不小於200的行

 

 

awk -F ":" '{max=($3>=$4)?$3:$4;{print max}}' /etc/passwd     # ($3>$4)?$3:$4三元運算符,如果第3個字段的值大於等於第4個字段的值,則把第3個字段的值賦給max,否則第4個字段的值賦給max

 

 

awk -F ":" '{print NR,$0}' /etc/passwd   #輸出每行內容和行號,每處理完一條記錄,NR值加1

 

awk -F ":" '$7~"/bash"{print $1}' /etc/passwd   #輸出以冒號分隔且第7個字段中包含/bash的行的第1個字段

 

awk -F ":" '($1~"root")&&(NF==7){print $1, $2}' /etc/passwd   #輸出第1個字段中包含root且有7個字段的行的第1、2個字段

 

awk -F ":” '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
#輸出第7個字段既不為/bin/bash,也不為/sbin/nologin的所有行

 

四、通過管道,雙引號調用shall命令

echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'  
#統計以冒號分隔的文本段落數,END{}語句塊中,往往會放入打印結果等語句

 

awk -F: '/bash$/{print | "wc -1"}' /etc/passwd 
  #調用wc -1命令統計使用bash 的用戶個數,等同於grep -c "bash$" /etc/passwd

 

free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'  
#查看當前 內存使用百分比

 

top -b -n 1| grep Cpu | awk -F ',' '{print$4}'| awk '{print$1}'  
 #查看當前CPU空閑率,(-b-n 1 表示只需要1次的輸出結果

 

date -d "$ (awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H: %M: %S"    
 #顯示上次系統重啟時間,等同於upt ime; second ago為顯示多少秒前的時間,+"%F %H: %M:%S"等同於+"*Y-%m-%d %H:%M:%S"的時間格式

 

awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}' 
#調用w命令,並用來統計在線用戶數

 

awk 'BEGIN {"hostname" | getline ; {print $0}}'  
#調用hostname, 並輸出當前的主機名

• 當getline左右無重定向符“<”或“1”時,awk首先讀取到了第一行,就是1,然后getline, 就得到了1下面的第二行,就是2,因為getline之后,awk會改變對應的NF, NR, FNR和$0等內部變量,所以此時的$0的值就不再是1,而是2了,然后將它打印出來
• 當getline左右有重定向符“<”或“|”時,getline則作用於定向輸入文件,由於該文件是剛打開,並沒有被awk讀入一行,只是getline讀入,那么getline返回的是該文件的第一 行,而不是隔行
seq 10 | awk '{getline; print $0}'
seq 10 | awk '{print $0; getline}'

五、CPU使用率

1 cpu_us=`top -b -n 1 l grep Cpu I awk '{print $2}'
2 cpu_sy=`top -b -n 1 I grep Cpu l awk -F',''{print $2)' I awk'{print S1} 
3 cpu_sum=$((Scpu_us+Scpu_sy)) 
4 echo Scpu_sum

六、使用awk 統計 httpd 訪問日志中每個客戶端IP的出現次數

1 awk '{ip[$1]++}END{for(i in ip) {print ip[i],i}}' /var/log/httpd/access_log | sort -r
2 
3 備注:定義數組,數組名稱為ip,數字的下標為日志文件的第1列(也就是客戶端的IP地址),++的目的在於對客戶端進行統計計數,客戶端.
4 IP出現一次計數器就加1。END中的指令在讀取完文件后執行,通過循環將所有統計信息輸出,for 循環遍歷的是數組名ip的下標

 

 

 

 

 

  

 

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

 

  

  

 

 

  

 

  

 

  

 

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM