awk 编程语言
-抓取数据
-不能编辑文本
-针对细节文本搜索
一般格式
awk ‘{print xx }’ file
-xx:
$0 输出当行的所有内容
$1 文本第一个数据
$2 文本第二个数据
…
默认是使用空格做分隔符
[root@localhost ~]# cat test02
111 222 444
222 333 555
333 444 666
222 333 555
[root@localhost ~]# awk '{print $0}' test02
111 222 444
222 333 555
333 444 666
222 333 555
[root@localhost ~]# awk '{print $1}' test02
111
222
333
222
修改分隔符
awk -F选项
[root@localhost ~]# cat test01
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# awk -F : '{print $1}' test01
root
bin
daemon
adm
lp
多个符号作为分隔符 使用[ ]作为集合 例如:-F [: /]
内置函数
awk是进行逐行操作
有一些内置函数帮助我们输出
-NR 输出行数
-NF 输出列数
[root@localhost ~]# awk 'NR==4{print"这一行有"NF"个数据" }' test02
这一行有3个数据
[root@localhost ~]# awk '{print $0 "\t这是第"NR"行\t这一行有"NF"个数据" }' test02
111 222 444 这是第1行 这一行有3个数据
222 333 555 这是第2行 这一行有3个数据
333 444 666 这是第3行 这一行有3个数据
222 333 555 这是第4行 这一行有3个数据
-包含 ~
-不包含 !~
[root@localhost ~]# awk '$1~/111/' test02
111 222 444
[root@localhost ~]# awk '$0!~/nologin$/' test01
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk '$0~/nologin$/' test01
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
制定执行任务
格式
awk [option] BEGIN{}{}END{} file
第一个花括号是开始指定的任务
第二个花括号是每逐行操作执行完后执行的任务
END后值逐行操作完会执行的语句
例 列出哪些服务是拒绝用户登录的
[root@localhost ~]# awk -F : 'BEGIN{print "USER\t\tUID\tSTATUS"}/nologin$/{print $1"\t\t"$3"\t"$7}END{print ""}' /etc/passwd
USER UID STATUS
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
mail 8 /sbin/nologin
中间使用/nologin$/ 做条件筛选出无法登录系统的用户
适当使用制表符\t让表格美观些
可以嵌套for循环输出
也可以创建数组【】 下标同其他语言
使用字符以及字符串做下标 方便做数据统计
[root@localhost ~]# cat test03
1.1.1.1
2.2.2.2
1.1.1.1
3.3.3.3
2.2.2.2
5.5.5.5
[root@localhost ~]# awk '{a[$1]=a[$i]+1}END{for(i in a){print i, a[i]}}' test03
1.1.1.1 2
2.2.2.2 2
3.3.3.3 1
5.5.5.5 1
其中就使用a[1.1.1.1] 作为标识存储数据