Linux文件比較三劍客(awk/grep/sed)之a(chǎn)wk

一原押、什么是awk


awkLinux下的一個命令振诬,他對其他命令的輸出,對文件的處理都十分強大例驹,其實他更像一門編程語言撩幽,他可以自定義變量库继,有條件語句,有循環(huán)摸航,有數(shù)組制跟,有正則,有函數(shù)等酱虎。他讀取輸出,或者文件的方式是一行擂涛,一行的讀读串,根據(jù)你給出的條件進行查找聊记,并在找出來的行中進行操作,感覺他的設(shè)計思想恢暖,真的很簡單排监,但是結(jié)合實際情況,具體操作起來就沒有那么簡單了杰捂。他有三種形勢舆床,awkgawk嫁佳,nawk挨队,平時所說的awk其實就是gawk

二蒿往、awk命令格式和選項


·2.1 語法形式
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

·盡管操作可能會很復雜盛垦,但語法總是這樣,其中 pattern 表示 awk在數(shù)據(jù)中查找的內(nèi)容瓤漏,而 action是在找到匹配內(nèi)容時所執(zhí)行的一系列命令腾夯。花括號({})不需要在程序中始終出現(xiàn)蔬充,但它們用于根據(jù)特定的模式對一系列指令進行分組蝶俱。 pattern就是要表示的正則表達式,用斜杠括起來饥漫。

·awk語言的最基本功能是在文件或者字符串中基于指定規(guī)則瀏覽和抽取信息榨呆,awk抽取信息后,才能進行其他文本操作趾浅。完整的awk腳本通常用來格式化文本文件中的信息愕提。

·通常,awk是以文件的一行為處理單位的皿哨。awk每接收文件的一行浅侨,然后執(zhí)行相應(yīng)的命令,來處理文本证膨。

·2.2 命令選項

-F fs or --field-separator fs
指定輸入文件折分隔符如输,fs是一個字符串或者是一個正則表達式,如-F:央勒。

-v var=value or --asign var=value
賦值一個用戶定義變量不见。

-f scripfile or --file scriptfile
從腳本文件中讀取awk命令。

-mf nnn and -mr nnn
nnn值設(shè)置內(nèi)在限制崔步,-mf選項限制分配給nnn的最大塊數(shù)目稳吮;
-mr選項限制記錄的最大數(shù)目。這兩個功能是Bell實驗室版awk的擴展功能井濒,在標準awk中不適用灶似。

-W compact or --compat, -W traditional or --traditional
在兼容模式下運行awk列林。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略酪惭。

-W copyleft or --copyleft, -W copyright or --copyright
打印簡短的版權(quán)信息希痴。

-W help or --help, -W usage or --usage
打印全部awk選項和每個選項的簡短說明。

-W lint or --lint
打印不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告春感。

-W lint-old or --lint-old
打印關(guān)于不能向傳統(tǒng)unix平臺移植的結(jié)構(gòu)的警告砌创。

-W posix
打開兼容模式。但有以下限制鲫懒,不識別:\x嫩实、函數(shù)關(guān)鍵字、func刀疙、換碼序列以及當fs是一個空格時舶赔,將新行作為一個域分隔符;操作符****=不能代替^^=谦秧;fflush無效竟纳。

-W re-interval or --re-inerval
允許間隔正則表達式的使用,參考(grep中的Posix字符類)疚鲤,如括號表達式[[:alpha:]]锥累。

-W source program-text or --source program-text
使用program-text作為源代碼,可與-f命令混用集歇。

-W version or --version
打印bug報告信息的版本桶略。

三、awk的正則


匹配符 描述
\Y 匹配一個單詞開頭或者末尾的空字符串
\B 匹配單詞內(nèi)的空字符串
< 匹配一個單詞的開頭的空字符串诲宇,錨定開始
> 匹配一個單詞的末尾的空字符串际歼,錨定末尾
\W 匹配一個非字母數(shù)字組成的單詞
\w 匹配一個字母數(shù)字組成的單詞
' 匹配字符串末尾的一個空字符串
\‘ 匹配字符串開頭的一個空字符串

四、awk的函數(shù)


·4.1 字符串函數(shù)
函數(shù)名 描述
sub 匹配記錄中最大姑蓝、最靠左邊的子字符串的正則表達式鹅心,并用替換字符串替換這些字符串。如果沒有指定目標字符串就默認使用整個記錄纺荧。替換只發(fā)生在第一次匹配的 時候
gsub 整個文檔中進行匹配
index 返回子字符串第一次被匹配的位置旭愧,偏移量從位置1開始
substr 返回從位置1開始的子字符串,如果指定長度超過實際長度宙暇,就返回整個字符串
split 可按給定的分隔符把字符串分割為一個數(shù)組输枯。如果分隔符沒提供,則按當前FS值進行分割
length 返回記錄的字符數(shù)
match 返回在字符串中正則表達式位置的索引占贫,如果找不到指定的正則表達式則返回0桃熄。match函數(shù)會設(shè)置內(nèi)建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個數(shù)型奥。substr可利于這些變量來截取字符串
toupper和tolower 可用于字符串大小間的轉(zhuǎn)換蜻拨,該功能只在gawk中有效
·4.2 數(shù)學函數(shù)
函數(shù)名 返回值
atan2(x,y) y,x 范圍內(nèi)的余切
cos(x) 余弦函數(shù)
exp(x) 求 冪
int(x) 取整
log(x) 自然對 數(shù)
rand() 隨機數(shù)
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函數(shù)的種子
int(x) 取 整池充,過程沒有舍入
rand() 產(chǎn)生一個大于等于0而小于1的隨機數(shù)

五桩引、入門實例


·假設(shè)last -n 5的輸出如下

[root@www ~]# last -n 5 <==僅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

·如果只是顯示最近登錄的5個帳號

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

·awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄缎讼,然后將記錄按指定的域分隔符劃分域,填充域坑匠,$0則表示所有域,$1表示第一個域,$n表示第n個域血崭。默認域分隔符是"空白鍵" 或[tab]鍵,所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推厘灼。

·如果只是顯示/etc/passwd的賬戶

#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

·這種是awk+action的示例夹纫,每行都會執(zhí)行action{print $1}

-F指定域分隔符為':'设凹。

·如果只是顯示/etc/passwd的賬戶和賬戶對應(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的賬戶和賬戶對應(yīng)的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名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表示第一個域,$n表示第n個域,隨后開始執(zhí)行模式所對應(yīng)的動作action锄开。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作称诗。

·搜索/etc/passwdroot關(guān)鍵字的所有行

#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

·這種是pattern的使用示例萍悴,匹配了pattern(這里是root)的行才會執(zhí)行action(沒有指定action,默認輸出每行的內(nèi)容)寓免。

·搜索支持正則癣诱,例如找root開頭的: awk -F: '/^root/' /etc/passwd

·搜索/etc/passwdroot關(guān)鍵字的所有行,并顯示對應(yīng)的shell

# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

這里指定了action{print $7}


參考文獻:

http://man.lupaworld.com/content/manage/ringkee/awk.htm
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
http://www.codeweblog.com/awk命令-awk編程語言詳細介紹和實例/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袜香,一起剝皮案震驚了整個濱河市撕予,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌困鸥,老刑警劉巖嗅蔬,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疾就,居然都是意外死亡澜术,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門猬腰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟废,“玉大人,你說我怎么就攤上這事姑荷『醒樱” “怎么了缩擂?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長添寺。 經(jīng)常有香客問我胯盯,道長,這世上最難降的妖魔是什么计露? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任博脑,我火速辦了婚禮,結(jié)果婚禮上票罐,老公的妹妹穿的比我還像新娘叉趣。我一直安慰自己,他們只是感情好该押,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布疗杉。 她就那樣靜靜地躺著,像睡著了一般蚕礼。 火紅的嫁衣襯著肌膚如雪烟具。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天闻牡,我揣著相機與錄音净赴,去河邊找鬼。 笑死罩润,一個胖子當著我的面吹牛玖翅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播割以,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼金度,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了严沥?” 一聲冷哼從身側(cè)響起猜极,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎消玄,沒想到半個月后跟伏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翩瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年受扳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兔跌。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡勘高,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情华望,我是刑警寧澤蕊蝗,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站赖舟,受9級特大地震影響蓬戚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜建蹄,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一碌更、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洞慎,春花似錦、人聲如沸嘿棘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸟妙。三九已至焦人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間重父,已是汗流浹背花椭。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留房午,地道東北人矿辽。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像郭厌,于是被迫代替她去往敵國和親袋倔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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