Linux--awk命令

概述

  • awk為程序員提供了完整的編程模型类垫,awk程序由一個(gè)主輸入循環(huán)(main input loop)維持,主輸入循環(huán)反復(fù)執(zhí)行,直到終止條件被觸發(fā)畦戒。awk已經(jīng)搭好了主輸入循環(huán)框架籍嘹,程序員寫(xiě)的代碼被嵌入到主輸入循環(huán)框架中執(zhí)行闪盔。例如在java中,程序員需要寫(xiě)一個(gè)main函數(shù)辱士,打開(kāi)文件泪掀、讀取文件行、進(jìn)行相應(yīng)處理颂碘,關(guān)閉文件异赫,awk自動(dòng)完成了上述步驟。
  • awk還定義了兩個(gè)特殊的字段头岔,BEGIN和END塔拳,BEGIN用于在主輸入循環(huán)之前執(zhí)行,即在未讀取文件行之前執(zhí)行切油,END在主輸入循環(huán)之后執(zhí)行蝙斜,即在讀取輸入行完畢后執(zhí)行。
  • 簡(jiǎn)單的說(shuō)澎胡,awk就是把文件逐行的讀入孕荠,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種分析處理攻谁。

awk使用方法

  • awk語(yǔ)句都是由模式和動(dòng)作組成稚伍,模式是一組用于測(cè)試輸入行是否需要執(zhí)行動(dòng)作的規(guī)則,動(dòng)作是包含語(yǔ)句戚宦、函數(shù)和表達(dá)式的執(zhí)行過(guò)程个曙。簡(jiǎn)而言之,模式?jīng)Q定動(dòng)作何時(shí)觸發(fā)和觸發(fā)事件受楼,動(dòng)作執(zhí)行對(duì)輸入行的處理垦搬。
    • awk [-F 域分隔符] ‘a(chǎn)wk程序段’輸入文件
    • awk -f awk腳本文件 輸入文件
  • 基本命令格式如下:
case-1:
[root@localhost ~]# awk '條件1 {動(dòng)作 1} 條件 2 {動(dòng)作 2} …' 文件名
case-2:
awk '{pattern + action}' {filenames}

awk條件(pattern)

awk支持的主要條件.png

例如:
x>10:判斷變量 x 是否大于10;
x == y:判斷變量 x 是否等于變量 y艳汽;
A~B:判斷字符串 A 中是否包含能匹配 B 表達(dá)式的子字符串猴贰;
A!~B:判斷字符串 A 中是否不包含能匹配 B 表達(dá)式的子字符串;

  • awk內(nèi)置函數(shù)
ARGC               命令行參數(shù)個(gè)數(shù)
ARGV               命令行參數(shù)排列
ENVIRON            支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FILENAME           awk瀏覽的文件名
FNR                瀏覽文件的記錄數(shù)
FS                 設(shè)置輸入域分隔符河狐,等價(jià)于命令行 -F選項(xiàng)
NF                 瀏覽記錄的域的個(gè)數(shù)
NR                 已讀的記錄數(shù)
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符

awk動(dòng)作(action)

格式化輸出米绕;
流程控制語(yǔ)句瑟捣;

awk調(diào)用的三種方式

1.命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令栅干,[-F域分隔符]是可選的迈套。 input-file(s) 是待處理的文件。
在awk中碱鳞,文件的每一行中桑李,由域分隔符分開(kāi)的每一項(xiàng)稱為一個(gè)域。通常劫笙,在不指名-F域分隔符的情況下芙扎,默認(rèn)的域分隔符是空格。

2.shell腳本方式
將所有的awk命令插入一個(gè)文件填大,并使awk程序可執(zhí)行戒洼,然后awk命令解釋器作為腳本的首行,一遍通過(guò)鍵入腳本名稱來(lái)調(diào)用允华。
相當(dāng)于shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk

3.將所有的awk命令插入一個(gè)單獨(dú)文件圈浇,然后調(diào)用:
awk -f awk-script-file input-file(s)
其中,-f選項(xiàng)加載awk-script-file中的awk腳本靴寂,input-file(s)跟上面的是一樣的磷蜀。

awk入門(mén)案例

  • 按逗號(hào)分隔符獲取最后5行,第3列;(awk的默認(rèn)分隔符為空格)
[liyahui@172 14]$ tail -n 5  /etc/passwd | awk  '{print $1}'
root
root
root
dmtsai
root
  • awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄百炬,然后將記錄按指定的域分隔符劃分域褐隆,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域剖踊。默認(rèn)域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶庶弃,$3表示登錄用戶ip,以此類推。
  • 如果只是顯示/etc/passwd的賬戶
#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys
  • 這種是awk+action的示例德澈,每行都會(huì)執(zhí)行action{print $1}歇攻。
  • -F指定域分隔符為':'。
  • 如果只是顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以tab鍵分割;
#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh
  • 如果只是顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以逗號(hào)分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"梆造。
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
  • awk工作流程是這樣的:先執(zhí)行BEGING缴守,然后讀取文件,讀入有/n換行符分割的一條記錄镇辉,然后將記錄按指定的域分隔符劃分域屡穗,填充域,0則表示所有域,1表示第一個(gè)域,$n表示第n個(gè)域,隨后開(kāi)始執(zhí)行模式所對(duì)應(yīng)的動(dòng)作action忽肛。接著開(kāi)始讀入第二條記錄······直到所有的記錄都讀完鸡捐,最后執(zhí)行END操作。
  • 搜索/etc/passwd有root關(guān)鍵字的所有行
#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • 這種是pattern的使用示例麻裁,匹配了pattern(這里是root)的行才會(huì)執(zhí)行action(沒(méi)有指定action,默認(rèn)輸出每行的內(nèi)容)。
  • 搜索支持正則煎源,例如找root開(kāi)頭的: awk -F: '/^root/' /etc/passwd
  • 搜索/etc/passwd有root關(guān)鍵字的所有行色迂,并顯示對(duì)應(yīng)的shell
# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash
  • 這里指定了action{print $7}
  • 統(tǒng)計(jì)/etc/passwd:文件名,每行的行號(hào)手销,每行的列數(shù)歇僧,對(duì)應(yīng)的完整行內(nèi)容:
#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
  • 使用printf替代print,可以讓代碼更加簡(jiǎn)潔,易讀
 awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

print和printf

  • awk中同時(shí)提供了print和printf兩種打印輸出的函數(shù)锋拖。
  • 其中print函數(shù)的參數(shù)可以是變量诈悍、數(shù)值或者字符串。字符串必須用雙引號(hào)引用兽埃,參數(shù)用逗號(hào)分隔侥钳。如果沒(méi)有逗號(hào),參數(shù)就串聯(lián)在一起而無(wú)法區(qū)分柄错。這里舷夺,逗號(hào)的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已售貌。
  • printf函數(shù)给猾,其用法和c語(yǔ)言中printf基本相似,可以格式化字符串,輸出復(fù)雜時(shí),printf更加好用颂跨,代碼更易懂敢伸。

awk編程

  • 變量和賦值
  • 除了awk的內(nèi)置變量,awk還可以自定義變量恒削。
  • 下面統(tǒng)計(jì)/etc/passwd的賬戶人數(shù)
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is  40
  • count是自定義變量池颈。之前的action{}里都是只有一個(gè)print,其實(shí)print只是一個(gè)語(yǔ)句,而action{}可以有多個(gè)語(yǔ)句蔓同,以;號(hào)隔開(kāi)饶辙。
    這里沒(méi)有初始化count,雖然默認(rèn)是0斑粱,但是妥當(dāng)?shù)淖龇ㄟ€是初始化為0,如下:
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is  0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is  40
  • 統(tǒng)計(jì)某個(gè)文件夾下的文件占用的字節(jié)數(shù)
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is  8657198
  • 如果以M為單位顯示:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is  8.25889 M
  • 注意弃揽,統(tǒng)計(jì)不包括文件夾的子目錄。

awk面試題

shell面試題


參考博客:
linux 之shell篇 awk命令
Shell awk命令詳解(格式+使用方法)
https://www.cnblogs.com/chenhuan001/p/6297615.html
shell 強(qiáng)大的awk
Shell編程之AWK的使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末则北,一起剝皮案震驚了整個(gè)濱河市矿微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尚揣,老刑警劉巖涌矢,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異快骗,居然都是意外死亡娜庇,警方通過(guò)查閱死者的電腦和手機(jī)塔次,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)名秀,“玉大人励负,你說(shuō)我怎么就攤上這事∝暗茫” “怎么了继榆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汁掠。 經(jīng)常有香客問(wèn)我略吨,道長(zhǎng),這世上最難降的妖魔是什么考阱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任翠忠,我火速辦了婚禮,結(jié)果婚禮上羔砾,老公的妹妹穿的比我還像新娘负间。我一直安慰自己,他們只是感情好姜凄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布政溃。 她就那樣靜靜地躺著,像睡著了一般态秧。 火紅的嫁衣襯著肌膚如雪董虱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天申鱼,我揣著相機(jī)與錄音愤诱,去河邊找鬼。 笑死捐友,一個(gè)胖子當(dāng)著我的面吹牛淫半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匣砖,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼科吭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猴鲫?” 一聲冷哼從身側(cè)響起对人,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拂共,沒(méi)想到半個(gè)月后牺弄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宜狐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年势告,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛇捌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡培慌,死狀恐怖豁陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吵护,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布表鳍,位于F島的核電站馅而,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏譬圣。R本人自食惡果不足惜瓮恭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厘熟。 院中可真熱鬧屯蹦,春花似錦、人聲如沸绳姨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飘庄。三九已至脑蠕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跪削,已是汗流浹背谴仙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碾盐,地道東北人晃跺。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毫玖,于是被迫代替她去往敵國(guó)和親掀虎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • linux awk命令詳解 來(lái)源:ggjucheng 鏈接:http://www.cnblogs.com/ggju...
    meng_philip123閱讀 860評(píng)論 0 1
  • 簡(jiǎn)介 awk是一個(gè)強(qiáng)大的文本分析工具孕豹,相對(duì)于grep的查找涩盾,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí)励背,顯得尤...
    JokerW閱讀 513評(píng)論 0 1
  • 簡(jiǎn)介 awk是一個(gè)強(qiáng)大的文本分析工具春霍,相對(duì)于grep的查找,sed的編輯叶眉,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí)址儒,顯得尤...
    ad085d162310閱讀 1,122評(píng)論 0 1
  • awk介紹awk變量printf命令:實(shí)現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,567評(píng)論 0 4
  • awk:報(bào)告生成器芹枷,格式化文本輸出 內(nèi)容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,457評(píng)論 0 9