Linux文本處理三劍客——awk

文本處理三工具:grep粒督,sed,awk

  • grep:文本過濾工具:pattern灭忠;
  • sed:行編輯器:模式空間膳算、保持空間;
  • awk:報告生成器:格式化文本輸出更舞;

awk命令

awk的運行方式

  • (1)awk 命令行
  • (2)awk 程序文件
  • (3)awk 腳本

命令格式

awk [options] 'program' FILE ....
其中畦幢,program:PATTERN{ACTION STATEMENT}
        PATTERN:模式
        ACTION STATEMENT:動作語句,可以是由多個語句組成缆蝉,各語句間使用分號分隔宇葱;

常用選項

-F:指明輸入時用到的字段分隔符;
-v var=value:自定義變量刊头;

awk工作過程

  • 一次性讀取一行文本黍瞧,然后根據(jù)輸入分隔符(默認為空格字符)對文本進行切片;
  • 將文本切成n個片段原杂,然后將每一片都賦予awk內(nèi)部的一個變量進行保存印颤,這些變量名為$1、$2穿肄、$3......$n年局;
  • awk可以對上述片段進行單獨處理,比如:顯示某一段咸产、特定段矢否、甚至可以對某些片段進行額外的加工處理,比如計數(shù)脑溢、運算等僵朗。

1.awk的輸出命令之一:print

用法:

print item1,item2,....
item:字符串,用引號引用屑彻;
       print "hello","world"
變量:顯示變量的值验庙,可以直接使用變量的名進行引用,不需要加$;
       print name
數(shù)值:無需加引號

要點:

  • (1)逗號分隔符社牲;
  • (2)輸出的各item可以是字符串粪薛,也可以是數(shù)值;當前記錄的字段搏恤、變量或awk的表達式汗菜;
  • (3)如果省略item,相當于print $0挑社;打印整行字符

實例

[root@localhost ~]# last -n 5
mageia   pts/1        192.168.0.8      Wed May 23 05:02 - 05:02  (00:00)    
root     pts/0        192.168.0.8      Thu May 17 23:23   still logged in   
logstash pts/1        192.168.0.8      Wed May 16 00:12 - 16:56  (16:43)    
root     pts/0        192.168.0.8      Sat May 12 23:27 - 23:22 (4+23:55)   
root     tty1                          Sat May 12 23:23   still logged in   

[root@localhost ~]# last -n 5 | awk '{print $1 "\t" $3}'
mageia  192.168.0.8
root    192.168.0.8
logstash    192.168.0.8
root    192.168.0.8
root    Sat

2.變量

2.1 內(nèi)置變量

NF:每一行($0)擁有的字段總數(shù)

  • print NF:顯示當前行的字段數(shù);
  • print $NF:顯示當前行的第NF字段的值巡揍;
    NR:目前awk所處理的是“第幾行”數(shù)據(jù)痛阻;
    FS:目前的分隔字符,默認為空白字符腮敌;

實例

  • 列出每一行的賬號(即$1)
  • 列出每一行的賬號(即awk內(nèi)的NR變量)
  • 并且說明阱当,改行有多少字段(即awk內(nèi)的NF變量)
[root@localhost ~]# last -n 5 | awk '{print $1 "\t lines:" NR "\t columes:" NF}'
mageia   lines:1     columes:10
root     lines:2     columes:10
logstash     lines:3     columes:10
root     lines:4     columes:10
root     lines:5     columes:9

2.2 自定義變量

  • -v var=value 變量名區(qū)分字符大小寫俏扩;在program中直接定義

實例

//使用文件/etc/issue的行數(shù),有多少行就顯示多少行Linux
[root@localhost ~]# awk -v Final='linux' '{print Final}' /etc/issue
linux
linux
linux

3.awk的邏輯運算符

>弊添,>=录淡,<,<=油坝,嫉戚!=,==
  • 模式匹配符:
~:是否匹配
!~:是否不匹配
  • 邏輯操作符:
&& 澈圈,||彬檀,!
  • 函數(shù)調(diào)用:
function_name(argu1瞬女,argu2窍帝,...)
  • 條件表達式:
selector?if-true-expression:if-false-expression

4.PATTERN模式

  • (1)empty:空模式诽偷,匹配每一行坤学;
  • (2)/regular expression/:僅處理能夠被此處的模式匹配到的行;
  • (3)relational expression:關(guān)系表達式报慕;結(jié)果有“真”有“假”深浮;結(jié)果為“真”才會被處理;
  • (4)line ranges:行范圍卖子,不支持直接給出數(shù)字的格式略号;
  • (5)BEGIN/END模式
    BEGIN{}:僅在開始處理文件中的文本之前執(zhí)行一次;
    END{}:僅在文本處理完成之后執(zhí)行一次洋闽;

實例

//awk處理/^[ab]/ 模式匹配的行玄柠,即a或b開頭的行
[root@localhost ~]# awk -F: '/^[ab]/ {print $1,$3}' /etc/passwd
bin 1
adm 3
abrt 173
avahi 70
bash 501
basher 502

//結(jié)果為真才處理,結(jié)果為假不處理
[root@localhost ~]# awk -F:'$3>=500{print $1,$3}' /etc/passwd
^C
[root@localhost ~]# awk -F:'$1~/root/{print $1,$3}' /etc/passwd
^C
//
[root@localhost ~]# cat /etc/passwd | awk -F: '$3<10 {print $1 "\t" $3}'
root    0
bin 1
daemon  2
adm 3
lp  4
sync    5
shutdown    6
halt    7
mail    8
[root@localhost ~]# awk -F: '$3<10 {print $1 "\t" $3}' /etc/passwd
root    0
bin 1
daemon  2
adm 3
lp  4
sync    5
shutdown    6
halt    7
mail    8
//awk處理2~10行
[root@localhost ~]#  awk -F: '(NR>=2&&NR<=10) {print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp

5.常用的action

  • (1)Expressions
  • (2)Control statements:if诫舅,while等:
  • (3)Compound statements:組合語句羽利;
  • (4)input statements
  • (5)output statements

5.1.if-else

  • 語法:if(condtions) statement [else statement]
  • 使用場景:對awk取得的整行或某個字段進行條件判斷;

實例

[root@localhost ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Jul  2 04:16:54 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
......
[root@localhost ~]# awk '{if($NF>5) printf $0} ' /etc/fstab
# Created by anaconda on Sun Jul  2 04:16:54 2017# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info      

5.2 while循環(huán)

  • 語法:while(condition) statement
    條件“真”刊懈,進入循環(huán)这弧;條件“假”,退出循環(huán)虚汛;
  • 使用場景:對一行內(nèi)的多個字段逐一類似處理時使用匾浪;對數(shù)組中的各元素逐一處理時使用;

實例

[root@localhost ~]# cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m

[root@localhost ~]# awk '{i=1;while(i<=NF){if(length($i)>=6) {print $i};i++}}' /etc/issue
CentOS
release
(Final)
Kernel

5.3 for循環(huán)

  • 語法:for(exper1;expr2;expr3) statement
  • for(variable assignment;condition;iteration process) {for-body}

實例

 [root@localhost ~]# awk '{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}' /etc/issue
CentOS
release
(Final)
Kernel
  • 特殊用法:能夠遍歷數(shù)組中的元素卷哩;
    語法:for(var in array) (for-body)

6.awk的輸出命令之二:printf格式化輸出

格式化輸出:

printf FORMAT,item1,item2,...
  • (1)FORMAT必須給出蛋辈;
  • (2)不會自動換行,需要顯式給出換行控制符,\n
  • (3)FORMAT中需要分別為后面的每個item指定一個格式化符號冷溶;

格式符:

  • 都以%開頭渐白,后跟單個字符
%c:顯示字符的ASCII碼;
%d逞频,%i:顯示十進制整數(shù)纯衍;
%e漫拭,%E:科學計數(shù)法數(shù)值顯示袍镀;
%f:顯示浮點數(shù)奠旺;
%g簇宽,%G:以科學計數(shù)法或浮點形式顯示數(shù)值菲嘴;
%s:顯示字符串调鬓;
%u:無符號整數(shù)翩隧;
%%:顯示%自身窝革;
修飾符:
#[.#]:第一個數(shù)字用來控制顯示的寬度堡掏;第二個#表示小數(shù)點后的精度应结;  %3.1f
-:左對齊
+:顯示數(shù)值的符號
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泉唁,隨后出現(xiàn)的幾起案子鹅龄,更是在濱河造成了極大的恐慌,老刑警劉巖亭畜,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扮休,死亡現(xiàn)場離奇詭異,居然都是意外死亡拴鸵,警方通過查閱死者的電腦和手機玷坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲藐,“玉大人八堡,你說我怎么就攤上這事∑肝撸” “怎么了兄渺?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汰现。 經(jīng)常有香客問我挂谍,道長,這世上最難降的妖魔是什么瞎饲? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任口叙,我火速辦了婚禮,結(jié)果婚禮上嗅战,老公的妹妹穿的比我還像新娘庐扫。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布形庭。 她就那樣靜靜地躺著,像睡著了一般厌漂。 火紅的嫁衣襯著肌膚如雪萨醒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天苇倡,我揣著相機與錄音富纸,去河邊找鬼。 笑死旨椒,一個胖子當著我的面吹牛晓褪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播综慎,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼涣仿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了示惊?” 一聲冷哼從身側(cè)響起好港,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎米罚,沒想到半個月后钧汹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡录择,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年拔莱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘竭。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡塘秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出货裹,到底是詐尸還是另有隱情嗤形,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布弧圆,位于F島的核電站赋兵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搔预。R本人自食惡果不足惜霹期,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拯田。 院中可真熱鬧历造,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臣淤,卻和暖如春橄霉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑蒋。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工姓蜂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人医吊。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓钱慢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卿堂。 傳聞我的和親對象是個殘疾皇子束莫,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

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

  • awk 基本語法: awk 是逐行處理文本內(nèi)容的; BEGIN{} 是初識化代碼塊御吞,在處理文件第一行內(nèi)容之前麦箍,定義...
    leadingsci閱讀 337評論 0 1
  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,769評論 0 16
  • 一陶珠,awk簡介 awk,文本處理三劍客之一挟裂,它的名稱得自于它的三個創(chuàng)始人Alfred Aho 、Peter Wei...
    千紙鶴V閱讀 2,403評論 0 6
  • awk介紹awk變量printf命令:實現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,560評論 0 4
  • 從機場到車站 從糾纏到離散 浮在空中的列車 孤單比速度更難計算 別說再見 別說感謝我一路相伴 終點太短暫 比沒有開...
    刃冷情深2020閱讀 145評論 0 0