运维之道 | 三剑客之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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章