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 3月 5 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、打印文本中含有root
和villian
字段的內容
[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