您的位置:首页 > 运维架构 > Shell

shell脚本-awk使用

2017-11-13 19:33 477 查看

shell脚本之awk使用

问题:什么是AWK?有什么用?怎么用?

解答

AWK是3个创始人的名字首写缩写,用于文本日志处理等的命令.

应用于后台日志处理

使用

#!bin/bash
##awk Test
#1.处理文本数据
#awk中的默认字段分隔符是任意的空白字符(例如空格或制表符),
#如果想要读取使用其他字段分隔符的文件,可以使用-F 选项指定,
#下面用于指定:冒号
awk -F: '{print $1 $7}' /etc/passwd

awk -F: '{print $1 " home is "$7}' /etc/passwd
#result:root home is /bin/bash


#将脚本存到文件里
vi script
#2.script里面的内容
{
print $1 " home is "$7
}

#执行script内容,这里的script是一个文件,需要使用-f参数指定

awk -F: -f script /etc/passwd

#BEGIN:有时可能需要在处理数据前运行脚本,比如为报告创建开头部分
#script里面的内容
BEGIN{
#为表头
print "this is start"
}

{
print $1 " home is "$7
}

END{
print "this is end"
#可以是表尾,生成汇总总结
}

#内置变量
#script内容
BEGIN{
#为表头
print "this is start"
#输入时指定字段的行分隔符,执行时可以不指定-F : 直接执行awk -f script /etc/passwd
FS=":"
#输入行分隔符,回车换行
RS="\n"
#Output Field Seperator,指定默认输出分割字段
OFS=":"
#Output Row Seperator,输出时行分隔符
ORS=","
#Number of Field字段数
NF:
#Number of 行Record数,所有文本总行,只能在END里面用
NR:
}

{
print $1 " home is "$7
}

END{
#awk -f script /etc/passwd /etc/passwd统计两个文本内容
print "this is end,total lines is:"NR
#可以是表尾,生成汇总总结
}


#awk中匹配操作符以及比较
#正则表达式需要放在/expr/中,/expr/在他要控制的程序脚本分左花括号前
awk '/110.52.250.126/ {print $1}' access_2013_05_30.log
#匹配到就会打印第一行出来

#~波浪线表示匹配的意思,因为日志文件中第一行$1是IP
awk '($1 ~ /110.52.250.126/) {print $7}' access_2013_05_30.log
#不满足/110.52.250.126/IP的就打印第七行
awk '($1! ~ /110.52.250.126/) {print $7}' access_2013_05_30.log


实例:分析互联网日志

vi apache_log_script

#匹配pv和uv,过滤一些不要的css,gif
#>重定向操作符&&还需要状态码等于200
首先过滤掉一些干扰数据,一些请求图片、js、css的
使用模式匹配进行过滤,默认使用空格分割之后带有url的是第7列(注意:.在模式中需要转义)
把原始数据中的资源请求地址和状态吗不是200的都过滤掉,保存到一个新的文件。
awk '($7 !~ /\.jpg|\.png|\.css|\.gif|\.js/ && $9~200){print $0}' access_2013_05_30.log > clean_2013_05_30.log

#统计PV、uv
##PV
#初始化变量pv=0
awk 'BEGIN{pv=0} {pv++} END{print "pv:" pv}' clean_2013_05_30.log
#方式2
awk 'END{print "pv:"NR}' clean_2013_05_30.log
#方式3WordCount
awk '{print $0}' clean_2013_05_30.log |wc -l

##UV
#可以放到shell脚本里面每天自动执行
#uv统计不重复的IP,先排序,去重,可以通过MAC地址统计内网的同一个IP的
#   注意:需要先排序再去重 这样才正确。否则uniq去重只会把挨着相等的去掉。

awk '{print $1}' clean_2013_05_30.log | sort -n | uniq -u |wc -l

#统计哪个用户访问次数(IP出现次数最多的)-c过滤后统计-k第一列,head 5前五名(可以统计一天访问多少次,再加以控制)
awk '{print $1}' clean_2013_05_30.log | sort -n |uniq -c |sort -nr -k 1|head -5


#sed去除第一列
sed -e 's/^.//g' dump_autotest.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 脚本 数据