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,因為它不是空字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/499577.html
標籤:Linux
上一篇:手把手教你搭建驚艷的博客
