awk用法

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      
原文地址:https://www.cnblogs.com/hanfei-1005/p/5707012.html