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