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

一、什么是awk


awkLinux下的一個命令,他對其他命令的輸出,對文件的處理都十分強(qiáng)大,其實他更像一門編程語言,他可以自定義變量,有條件語句,有循環(huán),有數(shù)組,有正則,有函數(shù)等。他讀取輸出,或者文件的方式是一行,一行的讀,根據(jù)你給出的條件進(jìn)行查找,并在找出來的行中進(jìn)行操作,感覺他的設(shè)計思想,真的很簡單,但是結(jié)合實際情況,具體操作起來就沒有那么簡單了。他有三種形勢,awkgawknawk,平時所說的awk其實就是gawk

二、awk命令格式和選項


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

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

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

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

·2.2 命令選項

-F fs or --field-separator fs
指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達(dá)式,如-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的擴(kuò)展功能,在標(biāo)準(zhǔn)awk中不適用。

-W compact or --compat, -W traditional or --traditional
在兼容模式下運行awk。所以gawk的行為和標(biāo)準(zhǔn)的awk完全一樣,所有的awk擴(kuò)展都被忽略。

-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、換碼序列以及當(dāng)fs是一個空格時,將新行作為一個域分隔符;操作符****=不能代替^^=fflush無效。

-W re-interval or --re-inerval
允許間隔正則表達(dá)式的使用,參考(grep中的Posix字符類),如括號表達(dá)式[[: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 匹配記錄中最大、最靠左邊的子字符串的正則表達(dá)式,并用替換字符串替換這些字符串。如果沒有指定目標(biāo)字符串就默認(rèn)使用整個記錄。替換只發(fā)生在第一次匹配的 時候
gsub 整個文檔中進(jìn)行匹配
index 返回子字符串第一次被匹配的位置,偏移量從位置1開始
substr 返回從位置1開始的子字符串,如果指定長度超過實際長度,就返回整個字符串
split 可按給定的分隔符把字符串分割為一個數(shù)組。如果分隔符沒提供,則按當(dāng)前FS值進(jìn)行分割
length 返回記錄的字符數(shù)
match 返回在字符串中正則表達(dá)式位置的索引,如果找不到指定的正則表達(dá)式則返回0。match函數(shù)會設(shè)置內(nèi)建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個數(shù)。substr可利于這些變量來截取字符串
toupper和tolower 可用于字符串大小間的轉(zhuǎn)換,該功能只在gawk中有效
·4.2 數(shù)學(xué)函數(shù)
函數(shù)名 返回值
atan2(x,y) y,x 范圍內(nèi)的余切
cos(x) 余弦函數(shù)
exp(x) 求 冪
int(x) 取整
log(x) 自然對 數(shù)
rand() 隨機(jī)數(shù)
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函數(shù)的種子
int(x) 取 整,過程沒有舍入
rand() 產(chǎn)生一個大于等于0而小于1的隨機(jī)數(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個域。默認(rè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,默認(rèn)輸出每行的內(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}


參考文獻(xiàn):

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編程語言詳細(xì)介紹和實例/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

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