awk的由來 awk這個工具的名字是由三個發明者的首字母組合而成。 awk是一個文本處理工具。 awk的版本 AWK:最早AWK是在unix上實現的,屬於貝爾實驗室的 NAWK:即NEW AWK,是AWK的升級版,也屬於貝爾實驗室。 GAWK:即GNU AWK,基於GNU重新編譯而來的,相容NAWK ...
awk的由來
-
awk這個工具的名字是由三個發明者的首字母組合而成。
-
awk是一個文本處理工具。
awk的版本
-
AWK:最早AWK是在unix上實現的,屬於貝爾實驗室的
-
NAWK:即NEW AWK,是AWK的升級版,也屬於貝爾實驗室。
-
GAWK:即GNU AWK,基於GNU重新編譯而來的,相容NAWK和AWK。
linux使用的是gawk,我們執行的awk是gawk的一個軟連接。
which awk #查看awk這個命令所在的位置
ll /usr/bin/awk #awk是一個軟連接,指向GAWK
awk工作原理
awk是逐行處理文本內容,當awk處理一個文本時,會一行一行進行處理,處理完當前行,再處理下一行,awk預設以”換行符”為標記,識別每一行
會把讀入的一行按照一個的條件分割成列 #預設使用空格作為分隔符
awk的語法格式
格式:
ark [option] 'program' file..
選項:
-F:用於指定分隔符 #例如:-F"|" 表示使用|作為每行的分隔符
-v:用於指定變數
awk的program
awk 的 program 參數由 pattern 和 action 組成。
Pattern 用於指定匹配模式,並對匹配的行執行後面的 action 操作,不匹配的行不做處理。
Action 用於指定要對匹配到的行進行什麼樣的操作,這些操作語句要包含在大括弧 {} 裡面。
如果沒有提供 pattern 參數,預設處理所有行。
program需要用單引號括起來
常見的action動作:print
pattern省略或為1,等價於 /.*/(任意字元)
action省略,等價於 { print }
program就是由pattern和action組成的
awk的工作過程
-
第一步:BEGIN:在文件處理之前所作的操作
-
第二步:讀入文件的每一行進行處理
-
第三步:文件處理完成之後執行END的語句塊
awk program的動作 print
-
print這個動作可以實現列印的功能。
-
使用分隔符將一行切成若幹列(預設的分隔符:空格),用S1..$n來表示第幾列 $0表示整行
print格式
格式:print item1, item2, ...
逗號作為分隔符
只有一個print動作,預設為:print $0
列印字元串要用雙引號括起來,不然就會認為是要給變數,數字不用加雙引號,變數和數字不需要
範例
例如:獲取分區的利用率
df -h | awk '{print $5}'
df | awk -F"[ %]+" '{print$1,$5}' #[ %]+:表示以一個以上空格或百分號作為分隔符
例如:取出網站訪問量最大的前3個IP
awk '{print $1}' nginx.access.log-20200428 |sort | uniq -c |sort -nr|head -3
sort命令:實現排序的功能(預設從小到大)
選項:
-n:以字元串的數字作為排序的一句
-r:將要比較的結果反轉 #逆序排序 最大的排最前面
uniq命令:用於去除重覆的行
選項:
-c:在每一行的前面顯示統計改行出現過的次數
-d:僅顯示重覆的行
-u:僅顯示不重覆的行
head命令:顯示文件指定的前幾行
-n num或 -num:顯示文件的開頭num行
例如:獲取指定網卡的ip地址
ifconfig eth0 | sed -n '2p' | awk '{print $2}'
sed命令:對指定的行進行操作,
-n:關閉自動列印功能
腳本位置:
2:表示第二行
腳本指定:
p:表示列印指定的行內容
awk中的變數
-
內置變數
-
外置變數
行;稱為記錄
列:稱為欄位或者域
awk的program中引用變數,不需要添加$符號
內置變數
FS:指定欄位的分隔符,相當於-F選項
例如: awk -v FS=":" #指定冒號作為每行分段的分隔符
OFS:指定輸出欄位的分隔符,FS值指定輸入欄位的分隔符。預設的都是空格
NF:欄位數量
NF:一行有多少列
NR:記錄的編號
NR:第幾行的編號,比如第四行,NR就是4
範例:獲取指定網卡的ip地址
ifconfig eth0 | awk 'NR==2{print $2}' #表示取第二行的內容 NR==2就是條件
FNR:對多個文件進行單獨的編號
使用NR的話就是把多個文件合在一起進行編號。
FILENAME:當前文件名
自定義變數
自定義變數的格式:-v 變數名=值
awk的PATTERN
pattern(模式)用戶指定需要處理文本的那些行。
-
沒指定pattern:表示匹配所有
-
匹配指定的行
-
匹配一個範圍
不指定pattern
沒有寫pattern:表示空模式,所有的行都匹配(大括弧前面沒任何條件內容)
匹配指定的行:
/正則表達式/:過濾符合正則表達式的行進行列印 --和sed的使用方法一樣的
#範例:ifconfig eth0 | awk '/netmask/{print }'
匹配一個範圍:
-
正則表達式寫法
-
內置變數NR寫法
行的區間範圍:不能直接寫行號,使用NR變數
例如:
NR>=5 && NR <=8 --- 第五行到第八行
正則表達式的寫法: /pattern1/,/pattern2/
awk的操作符
-
算數操作符
-
模式匹配符
-
邏輯操作符
算數操作符:> < == != >= <= % =(賦值)
範例:取奇,偶數行
seq 10 | awk 'NR%2==0' #能被2整除的就是偶數
seq 10 | awk 'NR%2==1' #不能被2整除的就是奇數
模式匹配符:
-
~ 左邊是否和右邊匹配,包含關係
-
!~ 是否不匹配
awk -F: '$0 ~ /root/{print $1}' /etc/passwd #表示包含root的行
邏輯操作符:
-
與:&&,並且關係
-
或:||,或者關係
-
非:!,取反
例如:
awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd #第三列大於等於0並且第三列的值小於等於1000
關係表達式:結果為真才進行處理
-
真:結果為非0值或非空字元串
-
假:結果為空字元串或0值
例如:
seq 10 | awk '1' #會輸出1到10,因為pattern為1表示為真,而action省略等價於 { print }
seq 10 | awk '0' #什麼都不會輸出,0表示為假
seq 10 | awk '"false"' #會輸出0到10,因為它不是空字元串