awk用法
简介
一)Pattern模式:
1)正则表达式,
只处理以r开头的行:awk -F : '/^r/ {printf $1}' /etc/passwd
2)表达式:awk -F : '($3>500)|| ($1=="/bin/bash") {print $1 }' /etc/passwd
3)指定匹配范围
4)BEGIN,END特殊模式
BEGIN:只在脚本运行前就就执行一次。
END:在脚本运行结束以后执行一次
二)action:
1)控制语句 if(条件)
awk -F : '{if ($1=="root") print $1 }' /etc/passwd
2)while循环
3)for循环 for(i=1;i<3;i++)
4)next 提前结束对文本本行的处理,并接着处理下一行
遍历数组,for(var in array) awk数组下标从1开始,数组下标可以使用任意字符串
1)显示出系统中用户的用户名,用户ID,及主目录
[root@sky mnt]# awk -F : '{print $1,$3,$6}' /etc/passwd | head -3
OFS:指定输出符
2)输出系统中所有用户名及相应的ID表格,并在表格的第一行为这两数添加标题。
[root@sky mnt]# cat 2.sh
#!/bin/bash
BEGIN {
printf "%-15s%s
","username","uid"
printf "******************
"
}
{
printf "%-15s%s
",$1,$3
}
如果程序很长可以先将程序保存在文件中,然后传递给awk . - f 可指定文件
3)打印出文件的第一行的和
[root@sky mnt]# gawk '{ sum += $1 }; END { print sum }' 3.sh
4)打印出系统中用户的ID数大500
[root@sky mnt]# awk -F : '$3>500 {printf "USER:%-15sUID:%s
",$1,$3}' /etc/passwd
5)打印出用户ID大于500,或者使用bash shll的用户
awk -F : '$3>500 {print $1;next} $7=="/bin/bash" {printf $1}' /etc/passwd
awk -F : '($3>500)|| ($1=="/bin/bash") {print $1 }' /etc/passwd
6)找到被修改的文件,并计算这些文件的大小
[root@server1 mnt]# sh 6.sh
filename:
filename:14:47 54
filename:15:43 75
filename:15:24 141
filename:19:01 13
filename:19:30 119
filename:03:27 146
**********
the sum is 548
7)打印出/etc/passwd中的偶数行
#!/bin/bash
#******************
#*copyleft maisui2016-03-13
#*version 1
awk '
BEGIN {FS=":"}
NR%2==0{
print NR,$0;
}' /etc/passwd
exit 0
或命令行的形式: awk 'BEGIN {FS=":";} NR%2==0 {print NR,$0;}' /etc/passwd
解释:awk 在进入主循环以后读取第一行的数据,内建变量NR的值是1,以后每读取一行数据,NR变量的数据就会自动加1,
内健变量:
NR:所处理的所有记录的行数
FS:输入行的字符分隔符
NF:当前记录中所包含的字段个数
OFS:输出时字段分割符
RS:输入时的记录分割符,默认使换行符
ORS:输出时的记录分割符,默认是换行符
9)找出ID大于120的用户,用if语句
[root@server4 3131]# awk -F : '{if ($3>120) printf "username:%-8s UID:%-5s
",$1,$3}' /etc/passwd
username:saslauth UID:499
username:nagios UID:500
username:varnish UID:498
10)写一个脚本递归描述一个目录下的所有文件,然后根据文件的所有者统计出每一个用户所用有的文件个数。
[root@desktop0 mnt]# ls -lR /mnt/ | awk '/^-/ {result[$3]++} END {for (s in result) {print s,result[s]}}'
kiosk 2
root 16
11)统计TCP的连接数
[root@desktop0 mnt]# netstat -ant | awk '/^tcp/ {STATE[$NF]++} END {for (s in STATE) {print s,STATE[s]}}'
LISTEN 13
ESTABLISHED 2
12)统计日志中文件IP的访问量
[root@desktop0 httpd]# awk ' /^[0-9]/ {count[$1]++} END {for (tcp in count) {printf "%-20s:%-10s
",tcp,count[tcp]}}' access_log-20160221
172.25.254.222 :32
172.25.254.112 :22