shell進階awk命令編排字段使用詳解
awk命令
awk是shell進階的重要命令,可以用來編排字段
awk把輸入流看做一串記錄的集合,每條記錄都可以進一步細(xì)分為字段,一個awk程序是一對以模式和大括號框起來的操作組合而成的,awk每次從文件中讀取一條記錄
awk [選項] '條件{動作} 條件{動作}' 文件
-v 設(shè)置變量值
pattern {action} 如模式匹配,則執(zhí)行操作 pattern {action}
# 打印第一個字段 awk 'print $1' # 打印整行 awk 'print $0' # 打印第2與第5個字段 awk 'print $2,$5' # 打印非空行 awk 'NF > 0 {print $0}'
在讀取數(shù)據(jù)時,默認(rèn)的分隔符是空格,可以使用-F來指定分隔符
#awk [-F 分隔符] '命令' input-file # 分隔符默認(rèn)是空格 # 例: 打印出root用戶記錄 awk -F: '$1=="root"{print $0}' /etc/passwd
在輸出數(shù)據(jù)時,默認(rèn)的分隔符是空格,可以使用-v來設(shè)置輸出字段分隔符
# 默認(rèn)情況下,-v 改變輸出字段的分隔字符,這里必須設(shè)置OFS變量來改變輸出字段分隔符 awk -F: -v 'OFS=**' '{print $1,$5}' /etc/passwd
標(biāo)量變量
保存單一值的變量叫做標(biāo)量變量,常用的有
- FILENAME 當(dāng)前輸入文件的名稱
FNR 當(dāng)前輸入文件的當(dāng)前行號,當(dāng)有多個輸入文檔時相當(dāng)有用
FNR == 3 選定第三條記錄
- FS 字段分隔符,默認(rèn)為空格
NF 當(dāng)前記錄的字段數(shù)
NF == 0 選定空記錄
NF > 3 選定擁有三個字段以上的記錄
NF < 5 選定第1到第4條記錄
- NR 輸入數(shù)據(jù)流的當(dāng)前行號
- OFS 輸出字段分隔字符,默認(rèn)為空格
- ORS 輸出記錄分隔字符,默認(rèn)為\n
- RS 輸入記錄分隔字符
- $0 當(dāng)前行的全部內(nèi)容
- $n 當(dāng)前行的第n的字段的內(nèi)容
自定義變量
可以使用-v來設(shè)置自定義變量
free | awk -v age="10" -v name="lily" '{print name,age}' lily 10 lily 10 lily 10
BEGIN和END
BEIGIN
BEGIN導(dǎo)致動作指令僅在讀取任何數(shù)據(jù)記錄之前執(zhí)行一次
awk 'BEGIN {print "OK"}' OK
END
END導(dǎo)致動作指令僅在讀取完所有數(shù)據(jù)記錄后執(zhí)行一次
free | awk 'END {print "共有"NR"行"}' 共有3行
條件判斷
awk還支持if判斷語句
if(判斷條件){
動作指令1;
} else if(判斷條件2){
動作指令2;
} else {
動作指令N;
}
free | awk '{if(NR==1){print $1}else if(NR==2){print $2}}' total 8008932
循環(huán)語句
awk還支持循環(huán),如for循環(huán)、while循環(huán),且支持使用continue、break、exit來進行中斷
for循環(huán)
for(表達式1;表達式2;表達式3) {
動作指令序列
}
awk 'BEGIN{ for (i=1;i<=4;i++) {print i}}' 1 2 3 4
while循環(huán)
while(條件判斷){
動作指令序列;
}
awk 'BEGIN{ i=1; while(i<=4) {print i;i++}}' 1 2 3 4
命令行參數(shù)
awk通過內(nèi)建變量ARGC(參數(shù)計數(shù))和ARGV(參數(shù)值)讓命令行參數(shù)可用
awk 'BEGIN {print ARGV[0]}'
輸出 awk
awk 'BEGIN {for (k=0;k<ARGC;k++) print "ARGV["k"]=["ARGV[k]"]"}' a b c ARGV[0]=[awk] ARGV[1]=[a] ARGV[2]=[b] ARGV[3]=[c]
舉例
統(tǒng)計磁盤可用空間
df | grep -v tmpfs | awk '{sum+=$4} END{print "磁盤可用容量:"sum/1024/1024"G"}''
磁盤可用容量:1.01912G
統(tǒng)計nginx各ip訪問次數(shù)
awk ' \ > {IP[$3]++} \ > END { \ > for (i in IP) {print i,IP[i]} \ > }' /var/log/nginx/access.log
以上就是shell進階awk命令編排字段使用詳解的詳細(xì)內(nèi)容,更多關(guān)于shell awk命令編排字段的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux命令每天必學(xué)之 useradd/adduser 新增用戶
Linux下useradd或adduser命令用來建立用戶帳號和創(chuàng)建用戶的起始目錄,使用權(quán)限是超級用戶。接下來通過本文給大家介紹每天必學(xué)Linux命令之 useradd/adduser 新增用戶的相關(guān)知識,需要的朋友參考下吧2018-10-10bash提取字符串${string:position:length}的具體使用
本文主要介紹了bash提取字符串${string:position:length}的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06