shell命令之a(chǎn)wk

一豺鼻、awk簡介

awk 是一種編程語言综液,用于在linux/unix下對文本和數(shù)據(jù)進行處理款慨。
數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入儒飒、一個或多個文件,或其它命令的輸出檩奠。
支持用戶自定義函數(shù)和動態(tài)正則表達(dá)式等先進功能桩了,是linux/unix
下的一個強大編程工具。
在命令行中使用埠戳,但更多是作為腳本來使用井誉。
awk的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件整胃,從第一行到最后一行颗圣,尋找匹配的特定模式的行,并在這些行上進行你想要的操作屁使。如果沒有指定處理動作在岂,則把匹配的行顯示到標(biāo)準(zhǔn)輸出(屏幕),如果沒有指定模式蛮寂,則所有被操作所指定的行都被處理蔽午。
awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人酬蹋,分別是Alfred Aho及老、Brian Kernighan、Peter Weinberger范抓。
gawk是awk的GNU版本骄恶,它提供了Bell實驗室和GNU的一些擴展。
二匕垫、awk的兩種形式語法格式

awk [options] 'commands' filenames
awk [options] -f awk-script-file filanames

options:
-F對于每次處理的內(nèi)容僧鲁,可以指定一個子定義的分隔符,默認(rèn)的分隔符是空白字符(空格或 tab 鍵 )
command:

BEGIN{}                        {}               END{}

處理所有內(nèi)容之前的動作       處理內(nèi)容中的動作   處理所有內(nèi)容之后的動作

示例

 awk 'BEGIN{print "----開始處理了---"} {print "ok"} END{print "----都處理完畢---"}' /etc/hosts
----開始處理了---
ok
ok
ok
----都處理完畢---

BEGIN{}通常用于定義一些變量年缎,例如BEGIN{FS=":";OFS="---"}

三悔捶、awk工作原理

awk -F: '{print $1,$3}' /etc/passwd
(1)awk,會處理文件的每一個行单芜,每次處理時蜕该,使用一行作為輸入,并將這一行賦給內(nèi)部變量$0洲鸠,每一行也可稱為一個記錄堂淡,以換行符結(jié)束馋缅。
(2)然后,行被:(默認(rèn)為空格或制表符)分解成字段(或稱為域)绢淀,每個字段存儲在已編號的變量中萤悴,從$1開始,最多達(dá)100個字段皆的。
(3)awk如何知道用空白字符來分隔字段的呢覆履? 因為有一個內(nèi)部變量FS來確定字段分隔符。初始時费薄,F(xiàn)S賦為空白字符硝全。
(4)awk打印字段時,將以內(nèi)置的方法使用 print 函數(shù)打印楞抡,awk 在打印出的字段間加上空格伟众。這個空格是內(nèi)部的一個變量 OFS 輸出字段的分隔符, 逗號 , 會和 OFS 進行映射,通過 OFS 可以控制這個輸出分隔符的值召廷。
(5)awk輸出之后凳厢,將從文件中獲取另一行,并將其存儲在$0中竞慢,覆蓋原來的內(nèi)容先紫,然后將新的字符串分隔成字段并進行處理。該過程將持續(xù)到所有行處理完畢梗顺。
==============================================================

四泡孩、記錄與字段相關(guān)內(nèi)部變量

$0 :awk變量 $0 保存當(dāng)前正在處理的行內(nèi)容
NR :當(dāng)前正在處理的行是 awk 總共處理的行號。
FNR:當(dāng)前正在處理的行在其文件中的行號寺谤。
NF :每行被處理時的總字段數(shù)
FS :輸入行時的字段分隔符仑鸥,默認(rèn)空格

awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd
以:作分隔符,取第1部分和第3部分

OFS: 輸出字段分隔符,默認(rèn)是一個 空格

awk 'BEGIN{FS=":"; OFS="+++"} /^root/{print $1,$2,$3,$4}' /etc/passwd
以:做分隔符变屁,+++代替空格連接字段眼俊,輸出1、2粟关、3疮胖、4部分

ORS輸出記錄分隔符, 默認(rèn)是換行符.

示例

將文件每一行合并為一行(將ORS的默認(rèn)輸出換行符\n改成空格 )

awk 'BEGIN{ORS="  "} {print $0}' /etc/passwd 

五、格式化輸出

printf 函數(shù)
awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
以:作分隔符,左對齊輸出1闷板、2澎灸、3部分,且1、3部分長15個字符,2部分長10個字符
awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
同上遮晚,只是中間多了 | 做分隔

%s字符類型
%d 十進制整數(shù)
%f浮點類型
%-15s占15字符 - 表示左對齊性昭,默認(rèn)是右對齊
printf 默認(rèn)不會在行尾自動換行,加 \n

六县遣、awk模式和動作

任何 awk 語句都由 模式 和 動作 組成糜颠。
模式部分 決定動作語句何時觸發(fā)及觸發(fā)事件汹族。
如果省略模式部分,動作將時刻保持執(zhí)行狀態(tài)其兴。
模式可以是任何條件語句或復(fù)合語句或正則表達(dá)式顶瞒。

模式可以是

正則表達(dá)式:(正則表達(dá)式需要寫在//中)

匹配記錄(整行的匹配):
awk '/^root/' /etc/passwd #root開頭的行
awk '$0 ~ /^root/' /etc/passwd #root開頭的行
awk '!/root/' passwd #不帶有root的行
awk '$0 !~ /^root/' /etc/passwd #不以root開頭的行
匹配字段:可以使用的匹配操作符(~!~
awk -F: '$1 ~ /^alice/' /etc/passwd #$1中alice開頭的行
awk -F: '$NF !~ /bash$/' /etc/passwd #最后一個字段不是bash結(jié)尾的行
比較表達(dá)式:

比較表達(dá)式采用對文本進行比較,只有當(dāng)條件為真元旬,才執(zhí)行指定的動作榴徐。
比較表達(dá)式使用關(guān)系運算符,用于比較數(shù)字與字符串法绵。

關(guān)系運算符有

< 小于 例如 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: '$NF == "/bin/bash"' /etc/passwd
awk -F: '$1 == "root"' /etc/passwd

df -P | grep '/' |awk '$4 > 25000'
條件表達(dá)式:
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
算術(shù)運算:+ - * / %(模-取余) ^(冪)

可以在模式中執(zhí)行計算箕速,awk都將按浮點數(shù)方式執(zhí)行算術(shù)運算

awk -F: '$3 * 10 > 500' /etc/passwd
awk -F: '{ if($3*10>500){print $0} }' /etc/passwd
邏輯操作符合復(fù)合模式

&&邏輯與,相當(dāng)于并且
||邏輯或朋譬,相當(dāng)于或者
!邏輯非,取反

awk -F: '$1~/root/ && $3<=15' /etc/passwd
awk -F: '$1~/root/ || $3<=15' /etc/passwd
awk -F: '!($1~/root/ || $3<=15)' /etc/passwd
范圍模式, 模式之間用逗號 , 隔開

使用語法是:起始表達(dá)式兴垦,終止表達(dá)式

下面例子的意思是:從開頭是bin的行開始匹配成功一直到含有adm的行結(jié)束匹配
也就是 開頭是bin的行到含有adm的行的所有內(nèi)容都符合匹配條件

awk -F: '/^bin/,/adm/ {print $0 }' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
awk 正則示例:

匹配開頭是bin的或者開頭是root的行

awk -F: '/^(bin|root)/' /etc/passwd
root:x:0:0:root:/root:/bin/zsh
bin:x:1:1:bin:/bin:/sbin/nologin
指定多個分隔符:[]
echo "a b|c d| ||||e | |" |awk -F'[ |]' '{print $10}'徙赢。
e
echo "a b|c d| ||||e | |" |awk -F'[ |]' '{print $10}'
e

注意:在正則中,中括號[]內(nèi)的任意字符均視為普通字符探越,比如. *都被當(dāng)做普通字符狡赐。

echo "a.b*c" |awk -F'[.*]' '{print $1, $2,$3}'
a b c

七、awk的腳本編程

條件判斷

if語句
awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd

awk -F: '{ if($3==0){count++} else{i++} } END{print "管理員個數(shù): "count "系統(tǒng)用戶數(shù): "i}' /etc/passwd
輸入:
管理員個數(shù): 1系統(tǒng)用戶數(shù): 24

awk -F: '{ if($3==0){count++} else{i++} } END{print "管理員個數(shù): "count ; print  "系統(tǒng)用戶數(shù): "i}' /etc/passwd
輸出:
管理員個數(shù): 1
系統(tǒng)用戶數(shù): 24
if...else if...else 語句
awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print i; print k; print j}' /etc/passwd
輸出:
1
2
22

awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理員個數(shù): "i; print "普通用個數(shù): "k; print "系統(tǒng)用戶: "j}' /etc/passwd
輸出:
管理員個數(shù): 1
普通用個數(shù): 2
系統(tǒng)用戶: 22

awk使用外部變量

擴展
方法一:awk 參數(shù) -v (推薦使用钦幔,易讀)

[root@tianyun ~]# echo "unix script" |awk -v var="bash" 'gsub(/unix/,var)'
bash script

[root@tianyun ~]# awk -v user=root -F: '$1 == **user**' /etc/passwd
root:x:0:0:root:/root:/bin/bash

gsub 使 AWK 中的內(nèi)置函數(shù)枕屉,功能使搜索替換
'gsub(/unix/,var) 中的意思是搜索 unix 字符串,替換為 var 變量對應(yīng)的值

方法二:在雙引號的情況下使用

[root@tianyun ~]# var="bash"
[root@tianyun ~]# echo "unix script" |awk "gsub(/unix/,\"$var\")"
bash script

方法三:在單引號的情況下使用(逼不得已使用)

[root@tianyun ~]# var="bash"
[root@tianyun ~]# echo "unix script" |awk 'gsub(/unix/,"'"$var"'")'
bash script

其他練習(xí)

root@tianyun ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 2.8T 246G 2.5T 9% /
tmpfs 24G 20K 24G 1% /dev/shm
/dev/sda2 1014M 194M 821M 20% /boot

[root@tianyun ~]# df -h |awk '{ if(int($5)>5){print $6":"$5} }'
/:9%
/boot:20%

[root@tianyun ~]# i=10
[root@tianyun ~]# df -h |awk '{ if(int($5)>'''$i'''){print $6":"$5} }'
/boot:20%

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲤氢,一起剝皮案震驚了整個濱河市搀擂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卷玉,老刑警劉巖哨颂,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異相种,居然都是意外死亡威恼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門寝并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箫措,“玉大人,你說我怎么就攤上這事衬潦〗锫” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵别渔,是天一觀的道長附迷。 經(jīng)常有香客問我惧互,道長,這世上最難降的妖魔是什么喇伯? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任喊儡,我火速辦了婚禮,結(jié)果婚禮上稻据,老公的妹妹穿的比我還像新娘艾猜。我一直安慰自己,他們只是感情好捻悯,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布匆赃。 她就那樣靜靜地躺著,像睡著了一般今缚。 火紅的嫁衣襯著肌膚如雪算柳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天姓言,我揣著相機與錄音瞬项,去河邊找鬼。 笑死何荚,一個胖子當(dāng)著我的面吹牛囱淋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播餐塘,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼妥衣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戒傻?” 一聲冷哼從身側(cè)響起税手,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠鼻,沒想到半個月后冈止,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡候齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年熙暴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌盯。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡周霉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亚皂,到底是詐尸還是另有隱情俱箱,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布灭必,位于F島的核電站狞谱,受9級特大地震影響乃摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跟衅,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一孵睬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伶跷,春花似錦掰读、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雇初,卻和暖如春拢肆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抵皱。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工善榛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呻畸。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像悼院,于是被迫代替她去往敵國和親伤为。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容

  • grep grep的基本用法 grep命令是支持正則表達(dá)式的一個多用途文本搜索工具据途,一般格式為 grep 選項 模...
    王詩翔閱讀 3,079評論 2 34
  • 一颖医、awk簡介 awk 是一種編程語言位衩,用于在linux/unix下對文本和數(shù)據(jù)進行處理。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入熔萧、...
    沙礫丶ye閱讀 173評論 0 0
  • 一.基本介紹 1.awk: awk是一個強大的文本分析工具糖驴,在對文本文件的處理以及生成報表,awk是無可替代的佛致。a...
    大福技術(shù)閱讀 1,671評論 1 4
  • 一贮缕、awk簡介 awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進行處理俺榆。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入感昼、...
    休止符的嘆息閱讀 110評論 0 0
  • 一、awk簡介 awk其名稱得自于它的創(chuàng)始人 Alfred Aho 罐脊、Peter Weinberger 和 Bri...
    鐘離惜閱讀 4,965評論 0 2