shell脚本-awk使用

来源:互联网 发布:mac没有创建win7安装盘 编辑:程序博客网 时间:2024/05/21 12:49

shell脚本之awk使用

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

解答

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

应用于后台日志处理

使用

#!bin/bash##awk Test#1.处理文本数据#awk中的默认字段分隔符是任意的空白字符(例如空格或制表符),#如果想要读取使用其他字段分隔符的文件,可以使用-F 选项指定,#下面用于指定:冒号awk -F: '{print $1 $7}' /etc/passwdawk -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/passwdFS=":" #输入行分隔符,回车换行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是IPawk '($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=0awk 'BEGIN{pv=0} {pv++} END{print "pv:" pv}' clean_2013_05_30.log#方式2awk 'END{print "pv:"NR}' clean_2013_05_30.log#方式3WordCountawk '{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
原创粉丝点击