運維之道 | 三劍客之awk命令 - 排查統替

awk的用法:

awk 參數 ' BEGIN{} // {action1;action2} ' END{} 文件名

參數:

  • -F :指定分隔符
  • -f :調用腳本
  • -v :定義變量
  • Begin{} :初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變量,設置FS分隔符
  • // : 匹配代碼塊,可以是字符串或正則表達式
  • {} :命令代碼塊,包含一條或多條命令,多條命令用 ;隔開
  • END{} :結尾代碼塊,在對每一行進行處理之後再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息

awk中字符的含義:

字符 功能
$0 表示整個當前行
$1 每行第一個字段
NF 字段數量變量
NR 每行的記錄號,多文件記錄遞增
FNR 與NR類似,不過多文件記錄不遞增,每個文件都從1開始
\t 製表符
\n 換行符
FS BEGIN時定義分隔符
RS 輸入的記錄分隔符, 默認爲換行符(即文本是按一行一行輸入)
~ 包含
!~ 不包含
== 等於,必須全部相等,精確比較
!= 不等於,精確比較
&& 邏輯與
+ 匹配時表示1個或1個以上
/[0-9][0-9]+/ 兩個或兩個以上數字
/[0-9][0-9]*/ 一個或一個以上數字
OFS 輸出字段分隔符, 默認也是空格,可以改爲其他的
ORS 輸出的記錄分隔符,默認爲換行符,即處理結果也是一行一行輸出到屏幕
-F [:#/] 定義了三個分隔符

一、print 打印功能:

1、打印文本所有內容
[root@localhost ~]# awk '{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
2、打印文本中第一列內容
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
3、打印文本中第一列、第三列內容,同時中間用空格隔開
[root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
4、打印文本中第一列、第三列內容,中間不用任何字符隔開
[root@localhost ~]# awk -F: '{print $1$3}' /etc/passwd 
root0
bin1
daemon2
5、打印文本第一列、第二列、第三列內容,並以製表符隔開
[root@localhost ~]# awk -F: '{print $1,$2,$3}' OFS="\t" /etc/passwd
root    x       0
bin     x       1
daemon  x       2
6、打印文本第一列內容,並以分行的形式輸出
[root@localhost ~]# awk -F: '{print$1;print$2}' /etc/passwd
root
x
bin
x
daemon
x
7、自定義輸出第一列、第二列內容
[root@localhost ~]# awk -F: '{print "name:"$1"\tid:"$3}' /etc/passwd
name:root       id:0
name:bin        id:1
name:daemon     id:2
8、顯示每行有多少字段
[root@localhost ~]# awk -F: '{print NF}' /etc/passwd
7
7
7
9、將每行字段大於2的打印出來
[root@localhost ~]# awk -F: 'NF>2 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
10、將文本中第三行內容輸出
[root@localhost ~]# awk -F: 'NR==3{print}' /etc/passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
11、打印文本所有內容除了第一行
[root@localhost ~]# awk -F: 'NR!=1{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
12、將文本內容輸出到另一個文本中
[root@localhost ~]# awk -F: '{print > "1.txt"}' /etc/passwd
[root@localhost ~]# ll
總用量 32
-rw-r--r--. 1 root root 1199 35 17:46 1.txt
13、將文本內容追加到另一個文本中
[root@localhost ~]# awk -F: '{print}' /etc/passwd > 1.txt

二、字符匹配

1、打印文本含有root字段的文本
[root@localhost ~]# awk -F: '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2、打印文本中沒有含有root字段的文本
[root@localhost ~]# awk -F: '!/root/{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
3、打印文本中含有rootvillian字段的內容
[root@localhost ~]# awk -F: '/root|villian/{print}' /etc/passwd    
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
villian:x:1000:1000:villian:/home/villian:/bin/bash
4、打印以r開頭行的內容
[root@localhost ~]# awk -F: '/^[r]/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rsync:x:1001:1001::/home/rsync:/sbin/nologin
5、打印文本中以root開頭的行內容
[root@localhost ~]# awk -F: '$1~/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
6、打印文本中不是以root開頭的行內容
[root@localhost ~]# awk -F: '$1!~/root/{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
7、打印文本中以root或者villian開頭行的內容
[root@localhost ~]# awk -F: '$1~/root|villian/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
villian:x:1000:1000:villian:/home/villian:/bin/bash
8、打印文本中不是以root或者villian開頭行的內容
[root@localhost ~]# awk -F: '$1!~/root|villian/{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
9、統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:
[root@localhost ~]# awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd | more -5
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/n
10、打印/etc/passwd/的第二行信息
[root@localhost ~]# awk -F: 'NR==1{print "filename: "FILENAME, $0}' /etc/passwd 
filename: /etc/passwd root:x:0:0:root:/root:/bin/bash

四、awk 控制語句if-else

1、如果第三列內容大於1000,則輸出第一列、第三列內容
[root@localhost ~]# awk -F: '{if($3>=1000)print $1,$3}'  /etc/passwd
villian 1000
rsync 1001
2、如果設置NF變量爲"/bin/bash",如果行中含有NF變量,則輸出第一列內容
[root@localhost ~]# awk -F: '{if($NF=="/bin/bash")print $1}' /etc/passwd
root
villian
postgres
3、如何第三列內容大於或等於1000,則輸出Common,否則輸出root or Sysuser
[root@localhost ~]# awk -F: '{if($3>=1000) {print "Common user:%s\n",$1}else {print "root or Sysuser:%s\n",$1}}'   /etc/passwd 
root or Sysuser:%s
 root
root or Sysuser:%s
 bin
root or Sysuser:%s
 daemon
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章