一、awk簡介
awk是一種處理文本文件的語言,是一種強大的文本分析工具
二、awk的參數及語法
awk [參數] '{print 打印內容}' 處理的文件
-F:定義分隔符,表示讀入文件已指定的分隔符分隔
-v:進入變量模式,可以進行變量的賦值和調用(調用不需要加$符號)
三、awk的基本用法
用法一:輸出passwd中用戶名及用戶所使用的命令解釋器
#方式一 awk -F':' '{print $1" "$7}' /etc/passwd #輸出
root /bin/bash bin /sbin/nologin daemon /sbin/nologin #方式二 awk -F':' '{print $1" "$(NF)}' /etc/passwd #輸出
root /bin/bash bin /sbin/nologin daemon /sbin/nologin
其中NF表示每行分隔之后的總共的列數
NR表示行數
awk -F':' 'NR==5 {print $1" "$(NF)}' /etc/passwd #第五行的內容
lp /sbin/nologin
用法二:使用多個分隔符進行分隔
#輸出第五行的用戶名及最終的命令解釋器 awk -F'[:/]' 'NR==5 {print $1" "$(NF)}' /etc/passwd
#輸出
lp nologin 注:多個分隔符之間使用[](小括號聲明),awk默認的分隔符是空格
用法三:awk中使用變量
awk -v a=2 -v b=3 'NR==1 {print a+b}' /etc/passwd #輸出
5 注:awk工具必須依賴於文件
四、awk中的內置變量及運算符的使用
| 運算符 | 描述 |
| || | 邏輯或 |
| && | 邏輯與 |
| ~ ~! | 匹配正則表達式和不匹配正則表達式 |
| < <= > >= != == | 關系運算符 |
| 空格 | 連接 |
| + - * / % | 加減乘除取余 |
| ++ -- | 增加或減少 |
| $ | 字段引用 |
| in | 數組成員 |
接下來用的的文本內容,yanshi.txt
3 test nginx mysql
4 MySQL docker kvm awk
This's a test
22 tomcat redis shell,python,java
用法一:過濾第一例大於3的行
awk '$1 > 3' yanshi.txt
#輸出 4 MySQL docker kvm awk This's a test 22 tomcat redis shell,python,java
用法二:過濾第一列大於3並且第二列等於“MySQL”的行
awk '$1 > 3 && $2 == "MySQL"' yanshi.txt #輸出 4 MySQL docker kvm awk
| \$n | 當前記錄的第n個字段 |
| FS | 字段分隔符 |
| NF | 每行字段的個數 |
| NR | 已讀的記錄數,也就是行號 |
| OFS | 指定輸出記錄的分隔符 |
| FILENAME | 當前文件名 |
| IGNORECASE | 如果為真,則進行忽略大小寫的匹配 |
| ENVIRON | 環境變量關聯數組 |
| ERRNO | 最后一個系統錯誤的描述 |
| ORS | 輸出記錄分隔符(默認值是一個換行符)。 |
用法一:指定#作為輸出分隔
awk '{print $1,$2,$3}' OFS="#" yanshi.txt #輸出 3#test#nginx 4#MySQL#docker This's#a#test 22#tomcat#redis ############################ awk '{print $1,$2,$3}' ORS="#" yanshi.txt #輸出結果 3 test nginx#4 MySQL docker#This's a test#22 tomcat redis#
五、awk中的的正則表達式
| 元字符 | 說明 |
| ^ | 在串首部匹配 |
| $ | 在串尾部匹配 |
| . | 匹配任意字符 |
| * | 匹配零個或多個前導字符 |
| + | 匹配一個或多個前導字符 |
| ? | 匹配零個或一個前導字符 |
| [abc] | 匹配自定字符組(abc)中的字符 |
| [^abc] | 匹配任何一個不再指定字符組(abc)的字符 |
| [a-z] | 匹配a到z之間的任意一個字符 |
| a|b | 匹配a或b |
| (ab)+ | 匹配一個或多個ab的組合 |
| \* | 配置星號本身 |
| & | 用在替代串中,代表查找串中匹配到的內容 |
| {m} | 指點匹配前面的字符m次 |
| {m,} | 指定匹配前面的字符至少m次 |
| {m,n} | 指定匹配前面的字符m~n次 |
| ~,!~ | 指定標量與正則表達式匹配或不匹配 |
可以查看 awk正則運算表達式詳解
六、awk中的函數應用
應用一:求出已使用的內存的百分比
free | awk '/Mem/ {print int($3/$2*100)}' 13
應用二:生成一個隨機數
echo "" | awk '{srand(); print int(rand()*10)}' 5 echo "" | awk '{srand(); print int(rand()*10)}' 6 #srand()將rand的函數種子,rand()返回任意數n,其中0<=n<1
應用三:時間函數
#systime()函數返回當前時間戳
echo "" | awk '{print systime()}' 1581650690 [root@fengling ~]# date -d@1581650690 Fri Feb 14 11:24:50 CST 2020 [root@fengling ~]# date Fri Feb 14 11:25:36 CST 2020
#strftime()函數格式化時間
echo "" | awk '{print strftime("%Y-%m-%d %H:%M:%s")}'
2020-02-14 11:28:1581650907
#mktime()將指定時間轉換為時間戳
echo "" | awk '{print mktime(2018" "9" "10 " "10" "5" "20)}'
1536545120
date -d@1536545120
Mon Sep 10 10:05:20 CST 2018
七、awk的初始代碼塊與結束代碼塊
#要使用的文件log.txt
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.27 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=fa7c727f0&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.75 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=e7c5fbd34&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.29 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=d4b3050af&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
#開頭輸出yi結尾輸出三
echo "" | awk 'BEGIN {print"yi"} {print "er"} END{print "san"}' yi er san
實例一:打印出IP地址以及錯誤等級
要求格式:IP地址 錯誤等級
awk 'BEGIN{print "ip地址"" ""錯誤等級"} {print $5" "$3}' log.txt ip地址 錯誤等級 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.110 [error] 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.173 [error] 118.124.94.173 [error] 118.124.94.27 [error] 118.124.94.75 [error] 118.124.94.29 [info]
八、awk中的控制語句
實例一:if--else語句
#輸出錯誤等級為error的IP地址 awk '{if($3=="[error]") print $5}' log.txt 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.173 118.124.94.173 118.124.94.27 118.124.94.75
#輸出錯誤等級為error的IP地址,錯誤等級不為error輸出錯誤等級
awk '{if($3=="[error]")print $5; else print $3}' log.txt
[info]
118.124.94.110
118.124.94.110
[info]
118.124.94.110
118.124.94.173
118.124.94.173
118.124.94.27
118.124.94.75
[info]
實例二:while語句
echo "" | awk -v i=1 '{while(i<10){print(i); i = i + 1}}' 1 2 3 4 5 6 7 8 9
實例三:for語句
echo "" | awk '{for(i=1;i<=3;i++) print i}' 1 2 3
九、awk中的數組
awk '{line[NR] = $5} END{for(i=NR;i>0;i--) print line[i]}' log.txt 118.124.94.29 118.124.94.75 118.124.94.27 118.124.94.173 118.124.94.173 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 #數組名[下標] = 值
