在linux系统上有三大文本处理工具分别是:grep,sed,awk,这次主要来看看awk。
awk option ‘pattern‘ file
-F 指定分隔符;
-v 申明自定义变量;
查看当前系统上,用户名和用户shell,输出分隔符为~.
# awk -F: ‘BEGIN{OFS="~";print "UserName Shell"}{print $1,$7}END{print "================end============="}‘ /etc/passwd
还可以在中间加入模式(pattern),指定只对以in字符结尾的行做处理。
# awk -F: ‘BEGIN{OFS="~";print "UserName Shell"}/in$/{print $1,$7}END{print "================end============="}‘ /etc/passwd
显示当前系统上id号小于等于500的用户。(表达式匹配)
# awk -F: ‘$3<=500{print $1,$3}‘ /etc/passwd
显示当前系统上shell是/bin/bash的用户(模式匹配)
# awk -F: ‘BEGIN{OFS=":";print "UserName Shell"}$7~/bash/{print $1,$7}‘ /etc/passwd
控制语句:
判断用户ID是否为0,如果是就输出用户名并说明是一个管理员用户,如果不是输出用户名,说明是一个普通用户。
# awk -F: ‘{if ($3==0) {print $1,"Administrator";} else {print $1,"Common User"}}‘ /etc/passwd
统计下系统上有多少个id号大于500的用户
# awk -F: -v Sum=0 ‘{if ($3>=500) Sum++}END{print Sum}‘ /etc/passwd
显示number.txt文件中,所以大于100的数值。
# awk ‘{i=1;while (i<=NF) {if ($i>=100) print $i;i++}}‘ number.txt
do-while 至少执行一次循环体,不管条件满足与否。
# awk -F: ‘{i=4;do {print $i;i--}while (i>4)}‘ /etc/passwd
遍历/etc/passwd $1-$3数值,只输出字符数大于4的数据。
# awk -F: ‘{for(i=1;i<=3;i++){if (length($i)>=4){print $i}}}‘ /etc/passwd
使用for显示number.txt文件中,所以大于100的数值。
# awk ‘{for (i=1;i<=NF;i++){if ($i>=100) {print $i}}}‘ number.txt
查看网络连接各个状态的次数
# netstat -tan | awk ‘/^tcp/{state[$NF]++}END{for ( S in state) print S,state[S]}‘
统计日志每个ip访问了多少次
# awk ‘{ip[$1]++}END{for ( A in ip ) print A,ip[A]}‘ access_log
统计当前系统用户,每种shell各有多少个。
# awk -F: ‘{count[$NF]++}END{for (A in count )print A,count[A]}‘ /etc/passwd
awk的内置函数
split 将数据按分隔符切片保存至数组里
length 返回字符串的字符个数
查看当前每个IP连接,与连接次数。
# netstat -tan | awk ‘/:80/{split($5,client,":");IP[client[4]]++}END{for (A in IP) print A,IP[A]}‘
就是数组和split函数这里难了
OK完成了
Linux文本处理工具AWK使用解析,布布扣,bubuko.com