1、awk簡介:linux
awk 是一種編程語言,用於在 linux/unix 下對文本和數據進行處理。數據能夠來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。正則表達式
awk 的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操做。若是沒有指定處理動做,則把匹配的行顯示到標準輸出(屏幕),若是沒有指定模式,則全部的操做的所指定的行都被處理。編程
2、awk的兩種形式語法格式
bash
awk [options] 'commands' filenames //過濾並輸出文件符合條件的內容 awk [options] -f awk-script-file filenam //從腳本中調用編輯指令,過濾並輸出內容
options:
編程語言
-F 定義輸入字段分隔符,。默認的分隔符是空格或製表符(tab)
commands
ide
BEGIN{} {} END{} 行處理前 行處理 行處理後 BEGIN{} 一般用於定義一些變量,例如 BEGIN{FS=":";OFS="---"}
使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依據輸入文本開始執行,END語句用來在awk完成文本瀏覽動做後打印輸出文本總數和結尾狀態。函數
awk命令格式
工具
awk 'pattern' filename 示例:awk -F: '/root/' /etc/passwd awk '{action}' filename 示例:awk -F: '{print $1}' /etc/passwd awk 'pattern {action}' filename 示例:awk -F: '/root/{print $1,$3}' /etc/passwd 示例:awk 'BEGIN{FS=":"} /root/{print $1,$3}' /etc/passwd command |awk 'pattern {action}' 示例:df -P| grep '/' |awk '$4 > 25000 {print $4}'
3、awk工做原理
ui
# awk -F: '{print $1,$3}' /etc/passwd
(1)awk 使用一行做爲輸入,並將這一行賦給內部變量$0,每一行也可稱爲一個記錄,以換行符結束spa
(2)而後,行被:(默認爲空格或製表符)分解成字段(或域),每一個字段存儲在已編號的變量中,從$1 開始,最多達 100 個字段
(3)awk 如何知道用空格來分隔字段的呢? 由於有一個內部變量 FS 來肯定字段分隔符。初始時,FS 賦爲空格
(4)awk 打印字段時,將以設置的方法使用 print 函數打印,awk 在打印的字段間加上空格,由於$1,$3 之間有一個逗號。逗號比較特殊,它映射爲另外一個內部變量,稱爲輸出字段分隔符 OFS,OFS 默認爲空格
(5)awk 輸出以後,將從文件中獲取另外一行,並將其存儲在$0 中,覆蓋原來的內容,而後將新的字符串分隔成字段並進行處理。該過程將持續到全部行處理完畢
4、awk內建變量
FS:指定每行文本的字段分隔符,默認爲空格或製表位。(-F) NF:當前處理的行的字段個數。 NR:當前處理的行的行號(序數)。 $0:當前處理的行的整行內容。 $n:當前處理行的第 n 個字段(第 n 列)。 FILENAME:被處理的文件名。RS:數據記錄分隔,默認爲\n,即每行爲一條記錄。
5、格式化輸出
print函數
# date |awk '{print "Month: " $2 "\nYear: " $NF}' # awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd # awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd
printf 函數
# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd # awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
%s 字符類型
%d 數值類型
佔 15 字符
- 表示左對齊,默認是右對齊
printf 默認不會在行尾自動換行,加\n
===========================
6、awk模式
一、正則表達式:
匹配記錄(整行):
# awk '/^alice/' /etc/passwd # awk '$0 ~ /^alice/' /etc/passwd # awk '!/alice/' passwd # awk '$0 !~ /^alice/' /etc/passwd
匹配字段:匹配操做符(~ !~)
# awk -F: '$1 ~ /^alice/' /etc/passwd # awk -F: '$NF !~ /bash$/' /etc/passwd
二、比較表達式:
比較表達式採用對文本進行比較,只有當條件爲真,才執行指定的動做。比較表達式使用關係運算符,
用於比較數字與字符串。
關係運算符
運算符 含義 示例
< 小於 x<y <= 小於或等於 x<=y == 等於 x==y != 不等於 x!=y >= 大於等於 x>=y > 大於 x>y
# awk -F: '$3 == 0' /etc/passwd # awk -F: '$3 < 10' /etc/passwd # awk -F: '$7 == "/bin/bash"' /etc/passwd # awk -F: '$1 == "alice"' /etc/passwd # awk -F: '$1 ~ /alice/ ' /etc/passwd # awk -F: '$1 !~ /alice/ ' /etc/passwd # df -P | grep '/' |awk '$4 > 25000'
三、條件表達式:
# awk -F: '$3>300 {print $0}' /etc/passwd # awk -F: '{ if($3>300) print $0 }' /etc/passwd # awk -F: '{ if($3>300) {print $0} }' /etc/passwd # awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd
四、算術運算:+ - * / %(模) ^(冪 2^3)
能夠在模式中執行計算,awk 都將按浮點數方式執行算術運算
# awk -F: '$3 * 10 > 500' /etc/passwd # awk -F: '{ if($3*10>500){print $0} }' /etc/passwd
五、邏輯操做符和複合模式
&& 邏輯與 a&&b || 邏輯或 a||b ! 邏輯非 !a
# awk -F: '$1~/root/ && $3<=15' /etc/passwd # awk -F: '$1~/root/ || $3<=15' /etc/passwd # awk -F: '!($1~/root/ || $3<=15)' /etc/passwd
六、範圍模式
# awk '/Tom/,/Suzanne/' filename
示例
一、統計系統給用戶數
二、統計用戶名爲4個字符的用戶
三、自定義變量。查詢root用戶
四、得到網卡IP(出ipv6之外的全部IP)