三劍客之 awk用法

awk

  AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。
  之因此叫 AWK 是由於其取了三位創始人 Alfred Aho,Peter Weinberger 和 Brian Kernighan 的 Family Name 的首字符。
  相較於sed經常做用於一整個行的處理,awk則比較傾向於一行當中分紅數個字段來處理,由於awk至關適合小型的文本數據。shell

 基本格式

1 awk [選項參數] 'script' var=value file(s)
2 3 awk [選項參數] -f scriptfile var=value file(s)

awk後面接兩個單引號並加上大括號{ }來設置想要對數據進行的處理操做,awk能夠處理後續接的文件,也能夠讀取來自前個命令的標準輸,但若是awk主要是處理每一行的字段內的數據時,默認的字段分隔符爲「空格鍵」或「Tab鍵」數組

 

 工做原理

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

 常見的內建變量(可直接用)

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

按行輸出文本

實例1:輸出所有內容

實例2:輸出第1到第3行的內容

實例3:輸出第1行和第3行的內容,輸出奇數和偶數行

實例4:輸出包含指定字符的行

實例5:輸出包含指定字符的行並統計有多行

   BEGIN模式表示, 在處理指定的文本以前,須要先執行BEGIN模式中指定的動做
  awk再處理指定的文本,以後再執行END模式中指定的動做;
   END{ } 語句塊中,每每會 放入打印結果等語句

按字段輸出文本

實例1:輸出指定分隔符的指定字段

實例2:輸出指定字段在指定範圍內的行,並選擇輸出的字段

實例3:awk結合三元運算符的使用

經過管道、雙引號調用shell命令

 1 echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'                                    #統計以冒號分隔的文本段落數,END{}語句塊中,每每會放入打印結果等語句
 2 
 3 awk -F: '/bash$/{print | "wC -1"}' /etc/passwd                                    #調用wc -1命令統計使用bash 的用戶個數,等同於grep -c "bash$" /etc/passwd
 4 
 5 free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'                             #查看當前 內存使用百分比
 6 
 7 top -b -n 1| grep Cpu | awk-F ',' '{print$4}'| awk '{print$1}'                    #查看當前CPU空閒率,(-b-n 1 表示只須要1次的輸出結果)
 8 
 9 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"的時間格式
10 
11 awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'                       #調用w命令,並用來統計在線用戶數
12 
13 awk 'BEGIN {"hostname" | getline ; {print $0}}'                                   #調用hostname, 並輸出當前的主機名

 

1 CPU使用率
2 
3 cpu_us=`top -b -n 1 | grep Cpu | awk '{print $2}'`
4 cpu_sy=`top -b -n 1 | grep Cpu | awk -F ',' '{print $2}' | awk '{print $1}'`
5 cpu_sum=$(($cpu_us+$cpu_sy))
6 echo $cpu_sum

當getline左右無重定向符「<」或「1」時,awk首先讀取到了第一行,就是1,而後getline, 就獲得了1下面的第二行,就是2,由於getline以後,awk會改變對應的NF, NR, FNR和$0等內部變量,因此此時的$0的值就再也不是1,而是2了,而後將它打印出來

當getline左右有重定向符「<」或「|」時,getline則做用於定向輸入文件,因爲該文件是剛打開,並無被awk讀入一行,只是getline讀入,那麼getline返回的是該文件的第一 行,而不是隔行

1 seq 10 | awk '{getline; print $0}'
2 seq 10 | awk '{print $0; getline}'

注:seq 用於生成從一個數到另外一個數之間的全部整數工具

1 echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0}'
2 ABCD
3 AIBICID
4 $1=$1是用來激活$0的從新賦值,也就是說字段$1...和字段數NF的改變會促使awk從新計算$0的值,一般是在改變OFS後而須要輸出$0時這樣作

使用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的下標

cpu負載,內存容量,硬盤空間,網卡流量,安裝的軟件包數量,帳戶數量,當前登陸的帳戶數量,進程數量,輸錯密碼的主機

1 uptime, free -m,df -h, ifconfig ens33, rpm -qa|wc -l, /etc/passwd, who,ps aux, /var/log/secure

過濾密碼失敗的命令

1 awk 'BEGIN {ip[$11]=0}; /Failed password/ {ip[$11]++};END {for(i in ip){print i,ip[i]}}' /var/log/secure

cpu 使用狀況

1 #!/bin/bash
2 
3 us=`top -b -n 1 | grep Cpu | awk '{print $2}'`
4 echo "用戶佔用率爲:" $us
5 sy=`top -b -n 1 | grep Cpu | awk -F "," '{print $2}' | awk '{print $1}'`
6 echo "內核佔用率爲:" $sy
7 id=`top -b -n 1 | grep Cpu | awk -F ',' '{print $4}'| awk '{print $1}'`
8 echo "cpu空閒率爲:" $id
相關文章
相關標籤/搜索