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