一. AWK
1.awk必備基本概念
a. $0,$1,$2概念
$0在沒有指定區(qū)域或分隔符的情況下默認(rèn)輸出文件里的所有內(nèi)容;
如果指定了區(qū)域,比如像下面這樣,那么會輸出區(qū)域的某幾行。
$1和$2是指輸出被FS字段分隔符分隔之后的第一列和第一列數(shù)據(jù)
[root@localhost ~]# awk 'NR==1{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk 'NR==2{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
b.NF,NR,F(xiàn)S,RS
FS:字段分隔符,可以用-F來指定字段分隔符;默認(rèn)是空格
RS:記錄分隔符,默認(rèn)是每行末尾的換行符\n,可以統(tǒng)計(jì)行數(shù)
NF:區(qū)域號,一般不用于指定第幾列。$NF指的是最后一列,可與print聯(lián)合使用
NR:行號,可以指定行號取數(shù)據(jù),同時可以統(tǒng)計(jì)文件里的總共行數(shù)
[root@localhost ~]# awk -F ":" '{print "username:"$1"\t\tuid:"$3}' /etc/passwd|head -2
username:root uid:0
username:bin uid:1
\t是空格的意思
題目1:要求輸出/etc/passwd文件里的倒數(shù)第二行數(shù)據(jù)
[root@localhost ~]# awk 'END{print NR}' /etc/passwd
47
先利用END模塊取出所有行,再指定倒數(shù)第二行的行數(shù)。
題目2:要求將一些被換行符分隔的字段輸出為一行
[root@localhost jizuo]# vim awk/test-1.txt
mmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345
Big Tony
200 Incognito Ave.
Suburbia, WA 67890
[root@localhost jizuo]# awk 'BEGIN{FS="\n";RS=""}{print $1","$2","$3}' awk/test-1.txt
mmy the Weasel,100 Pleasant Drive,San Francisco, CA 12345
Big Tony,200 Incognito Ave.,Suburbia, WA 67890
所用方法是將行分隔符(RS)由換行符改為空或空行;將FS(字段分隔符)由默認(rèn)的空格改為換行符。
此種方法也有局限,就是只能輸出指定字段的文件成一行;如果是無限行數(shù)據(jù)呢,可以采用下面的方法:
root@localhost jizuo]# awk 'BEGIN{RS="EOF"}{gsub(/\n/,",");print}' awk/test-1.txt
mmy the Weasel,100 Pleasant Drive,San Francisco CA 12345,Big Tony,200 Incognito Ave.,Suburbia WA 67890,
先將行分隔符改為"EOF",文件末尾的意思。然后利用gsub函數(shù)將換行符改為逗號,然后輸出
c. print模塊
在代碼塊中,只能有一個print命令。并且,如果只出現(xiàn)了print命令,那么將默認(rèn)打印整行。
以下的兩個例子中可以看到,不論echo的是什么內(nèi)容,awk依然輸出的是print的內(nèi)容。包括第二個例子輸出了與/etc/passwd同樣行的hiya內(nèi)容
[root@localhost ~]# echo hhh|awk '{print "hello world"}'
hello world
[root@localhost ~]# awk '{print "hiya"}' /etc/passwd
hiya
hiya
hiya
hiya
hiya
hiya
hiya
...
d.BEGIN和END模塊
BEGIN模塊是在處理所有的文本信息之前執(zhí)行的代碼塊,主要用于初始化FS變量及其他全局變量。
END模塊是在處理完文件中的所有行之后執(zhí)行的代碼塊,主要用于執(zhí)行最終計(jì)算和打印輸出結(jié)尾流的摘要信息。
e.運(yùn)算符
算數(shù)運(yùn)算符,邏輯運(yùn)算符,關(guān)系運(yùn)算符
[root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}'
10
[root@localhost ~]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a>1||b>1)}'
0 1
[root@localhost ~]# echo|awk 'BEGIN{a="100testaaa"}a~/100/{print "ok"}'
ok
[root@localhost ~]# awk 'BEGIN{a="100testaaa";if(a~/100/){print"ok"}}'
ok
2.正則表達(dá)式
a.輸出該文件里所有包含root的行
[root@localhost jizuo]# awk '/root/{print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:985:979:Docker
輸出以冒號作為分隔符的第五列中包含root的整行數(shù)據(jù)
[root@localhost jizuo]# awk -F ':' '$5~/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
布爾表達(dá)式
[root@localhost jizuo]# awk -F: '$1=="root"&&$5=="root"{print $1","$5}' /etc/passwd
root,root
3.與if,while,數(shù)組的配合使用
題目1:將該服務(wù)器目前tcp連接各個狀態(tài)及個數(shù)輸出
先把最后一行取出來,然后利用數(shù)組和for循環(huán)對各個狀態(tài)進(jìn)行計(jì)數(shù)
第二種方法是利用sort和uniq進(jìn)行計(jì)數(shù)
[root@localhost jizuo]# netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'
LISTEN 22
ESTABLISHED 13
TIME_WAIT 61
SYN_SENT 54
[root@localhost jizuo]# netstat -an|awk '/^tcp/{print $NF}'|sort -n|uniq -c
13 ESTABLISHED
22 LISTEN
54 SYN_SENT
60 TIME_WAIT
題目2:統(tǒng)計(jì) web 日志訪問流量,要求輸出訪問次數(shù),請求頁面或圖片,每個請求的總大小,總訪問流量的大小匯總
awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]|"sort -rn -k1";print
"total size is :"total}' /app/log/access_log
total size is :172230
21 /icons/poweredby.png 83076
14 / 70546
8 /icons/apache_pb.gif 18608
4.常用函數(shù)
a.替換函數(shù)gsub
[root@localhost jizuo]# awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!
b.索引查詢函數(shù)index
[root@localhost jizuo]# awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok
[root@localhost jizuo]# awk 'BEGIN{info="this is a test2010test!";print index(info,"testt")?"ok":"no found";}'
no found
c.split函數(shù)
[root@localhost jizuo]# awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for (k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
名稱欄目:linux系統(tǒng)運(yùn)維三劍客-創(chuàng)新互聯(lián)
文章鏈接:http://www.rwnh.cn/article28/dosojp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、服務(wù)器托管、關(guān)鍵詞優(yōu)化、微信公眾號、用戶體驗(yàn)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容