awk是linxu里实用强大的字符类相关的处理程序,处理方式:逐行读取文件的方式+条件处理或统计。支持正规和扩展正规
1)基本操作方法
格式:awk [选项] '[条件]{指令}' 文件其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
Awk过滤数据时支持仅打印某一列,如第2列、第5列等。
处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。
----------
awk '{print $1,$3}' test.txt //打印文档第1列和第3列
df -h | awk '{print $4}' //打印磁盘的剩余空间
2)选项 -F 可指定分隔符
输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下:
----------
awk -F: '{print $1,$7}' /etc/passwd //以:为分割符
awk -F [:/] '{print $1,$10}' /etc/passwd //多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段
3)awk常用内置变量
'/条件/{print $1}' 可以加条件
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
输出每次处理的行号,以及当前行以“:”分隔的字段个数
----------
awk -F: '{print NR,NF}' passwd.txt //打印行,列号
awk '/pam/{print $1}' /var/log/secure
4) awk 'BEGIN{命令} {print $1} END{命令]' /a.txt BEGIN END 只执行一次
--------
awk -F: 'BEGIN{print "User UID HomeD"}/^[fshar].*/{print $1" "$3" "$6}' /etc/passwd | column -t // 打印标题 条件打印项目 文件 //column -t 专用于对齐排列显示
awk 'BEGIN{a=0}/bash$/ {a++}END{print a}' /etc/passwd //统计出文件bash结尾的行数
5) awk [选项] '[条件]{指令}' 文件
A.使用正则设置条件[模糊匹配]
/正规/ 在一整行匹配 $n~/正则/ $1~/root/ $2~/xx/ $3!~/0/
--------
awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd //输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息
awk -F: '$1~/ssh/' /etc/passwd //找出第一列是ssh开头的行
B.使用数值/字符串比较设置条件
比较符号:==(等于) !=(不等于) >(大于) >=(大于等于) <(小于) <=(小于等于)
--------
awk -F: 'NR==2{print}' /etc/passwd //输出第3行(行号NR等于3)的用户记录
awk -F: '$3>=1000{print $1,$3}' /etc/passwd //输出账户UID大于等于1000的账户名称和UID信息
C.逻辑测试条件
--------
awk -F: 'BEGIN{print"USERS PASSWD"}$2~/.{30,100}/{print$1" "$2}' /etc/shadow |column -t //输出账户UID大于1000或者账户UID小于10的账户信息 并对齐显示
awk -F: '$3>10 && $3<15' /etc/passwd //输出UID大于10小于15的账户信息
D.数学运算
--------
seq 200 | awk '$1%3==0{i++} END{print i}' //统计3的倍数的数量
seq 100 | awk '$1%3==0{print}' //打印能被3整除的数
awk 'BEGIN{x++;print x}'
awk 'BEGIN{x=8;print x+=2}'
awk 'BEGIN{x=8;x--;print x}'
awk 'BEGIN{print 2*3}'
awk 'BEGIN{print 2+3}'
awk 'BEGIN{ print 23%8}'
E.条件判断 if(判断){指令} || if(判断){指令}else{指令} || 数组循环 for(i in z){}
--------
awk -F: '{if($3<20){x++;print $1" "$3}}END{print "UID<20的总用户数:"x}' /etc/passwd | column -t //单分支语句,判断第三列UID小于20的就打印出来,结尾打印出总数
awk -F: '{if($3<20){x++;print $1" "$3}else{y++}}END{print "UID<20的总用户数:"x " ""UID>20的总用户数:"y}' /etc/passwd | column -t //多分支语句,判断第三列UID小于20的就打印出来,结尾打印出总数
awk -F: 'BEGIN{print"<USER> <UID>"}{if($3<20){x++;print $1" "$3}else{y++}}END{print "UID<20的总用户数:"x " ""UID>20的总用户数:"y}' /etc/passwd | column -t
awk 'BEGIN{a[0]++;print a[0]}' //打印数组类加
awk 'BEGIN{a[0]=1;a[1]=22;for(i in a){print a[i]}}' //for循环打印组
6)扩展
---------
awk -F: '{print NR" "$1}END{print"一共有:" NF "列\n一共有:"NR"行"}' /etc/passwd /etc/passwd 打印行数 对应的第一列内容 结尾 打出总列数 和行数
awk -F: '$2~/.{30,100}/{print$1"--->"$2}' /etc/shadow //列出第二列字符数在30-100以内的项
awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log //提取IP地址及访问量
awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr -k 2
ab -c 100 -n 1000 http://127.0.0.1/ //模拟100人访问网站访问1000次 IP地址
netstat -apn | awk '/:80/{print}' 找到80端口的进程ID和服务名
lsof -i:80 找出所有和80端口有关的进程ID和服务名