linux中的awk命令及用法


一、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

#數組名[下標]  = 值

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM