溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux系統(tǒng)運維三劍客

發(fā)布時間:2020-07-21 19:55:11 來源:網絡 閱讀:239 作者:Oliver_go123 欄目:系統(tǒng)運維

一. AWK
1.awk必備基本概念
a. $0,$1,$2概念
$0在沒有指定區(qū)域或分隔符的情況下默認輸出文件里的所有內容;
如果指定了區(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來指定字段分隔符;默認是空格
RS:記錄分隔符,默認是每行末尾的換行符\n,可以統(tǒng)計行數(shù)
NF:區(qū)域號,一般不用于指定第幾列。$NF指的是最后一列,可與print聯(lián)合使用
NR:行號,可以指定行號取數(shù)據(jù),同時可以統(tǒng)計文件里的總共行數(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(字段分隔符)由默認的空格改為換行符。
此種方法也有局限,就是只能輸出指定字段的文件成一行;如果是無限行數(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命令,那么將默認打印整行。
以下的兩個例子中可以看到,不論echo的是什么內容,awk依然輸出的是print的內容。包括第二個例子輸出了與/etc/passwd同樣行的hiya內容

[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í)行最終計算和打印輸出結尾流的摘要信息。

e.運算符
算數(shù)運算符,邏輯運算符,關系運算符

[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.正則表達式
linux系統(tǒng)運維三劍客

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

布爾表達式

[root@localhost jizuo]# awk -F: '$1=="root"&&$5=="root"{print $1","$5}' /etc/passwd
root,root

3.與if,while,數(shù)組的配合使用
題目1:將該服務器目前tcp連接各個狀態(tài)及個數(shù)輸出
先把最后一行取出來,然后利用數(shù)組和for循環(huán)對各個狀態(tài)進行計數(shù)
第二種方法是利用sort和uniq進行計數(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)計 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
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI