1 awk 用途 報告生成工具,主要在處理文本方面特別強大,也是一個獨立的程序語言,與grep sed 構成處理文本工具的三劍客。
同gawk 都是 GNU組織開發的開源工具
2 awk的工作原理,已每個記錄進行每個域的分離,如 常常是以每一行作為一個記錄,空白作為默認的與分隔符,然后以內置變量對每個域進行賦予變量!
3 語法結構
awk option scrips file
或這 echo “ ” | awk option scripts 管道使用
option 選項主要有
-F 指定分隔符,而不以默認的空白(空格符或者制表符)
-v 指定變量
-f 指定腳本的文件名,即將腳本放入一個文件當中,避免awk書寫太長,影響視覺,和重復編寫
scripts 是對 處理的文本進行的操作
awk程序用一對花括號來定義,必須將腳本命令放到兩個花括號當中。花括號必須用單引號引起來
如 awk -F : '{print $1,$4}' /etc/passwd
4 awk基本學會技能
1、使用數據字段變量 $1 ,$2,....$n
2、在腳本中使用多個命令 使用 ;
3、從文件中讀取腳本程序 使用 -f
4、在處理數據前運行的某些腳本內容 BEGIN
5、在處理數據后運行的某些腳本內容 END
5 簡單用法事例講解
實例一: 初識awk
[root@shiyan ~]# echo "how are you" | awk '{print $1,"\t",$3}'
how you
講解 awk 輸入流how are are 文本進行處理,首先 以空白進行分割字段域(filed) 然后用內置變量進行賦值
內置變量
$1 等於第一段域 實例中即 為how
$2 等於第二段域 實例中即 為 are
$3 等於第三段域 實例中即 為 you
如果還有段域 則依次類推 $4 ...$n
最后$0 等於整個記錄,即整行文本 how are you
此處沒有使用 option,使用默認的 空白 進行分割
scripts 為print $1,"\t",$3 打印第一個字段 和一個 制表符 和第三個字段
實例二:提取/data 分區的使用率
[root@shiyan ~]# df -h | grep "/data"
/dev/sda7 97G 1.2G 91G 2% /data
[root@shiyan ~]# df -h | grep "/data" | awk -F '[ \t%]+' '{print $5}'
2
解釋 一步完成了對/data 使用率的提取 使用率為2 ,-F 后面的指定分隔符時支持正則表達式的,此處為可以一空白 制表符 % 作為分隔符,且可以是N 個
上面也可以用如下進行,但顯得不夠專業,使用了兩次awk
[root@shiyan ~]# df -h | grep "/data" | awk '{print $5}' | awk -F '%' '{print $1}'
2
實例三 -f 的用法
[root@shiyan awk]# awk -F : '{test=" home directory is "; print $1,test, $6}' /etc/passwd
-f 的實現辦法
1 首先將 scripts 部分寫入一個文件當中
[root@shiyan awk]# cat awkfile
{
test="home directory is"
print $1, test, $6
}
[root@shiyan awk]# awk -F : -f awkfile /etc/passwd
root home directory is /root
bin home directory is /bin
實現的效果一樣,有時時非常有必要將處理腳本放入一個特定的文件中的,test="home directory is" 時test變量的賦值
實例四 -v選項的用法
[root@shiyan awk]# awk -F : -v test="home directory is" '{ print $1, test, $6}' /etc/passwd
結果同上實例,-v 指定對test 變量賦值
實例五: BEGIN在處理數據前運行某些腳本
如:
[root@shiyan awk]# awk -F : 'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd
解釋:BEGIN關鍵字會執行一次指定的腳本段,想要處理數據的腳本段在第二個程序中定義{ print $1,"\t\t", $7}
結果: 加上了 User ---------Sheel 的抬頭
[root@shiyan awk]# awk -F : 'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd
User -------------- Shell
root /bin/bash
bin /sbin/nologin
.....
實例六: END
[root@shiyan awk]# awk -F : 'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}END {print "The is last Line"}' /etc/passwd
結束 在所有操作完成之后,執行 END關鍵字定義的腳本段 END {print "The is last Line"}
注意: 兩段或者三段腳本命令 在awk上會被當成一個文本字符串,所以必須要加上一個 單引號
awk的高級用法即體現程序語言的用法請參考一下文章