awk自定义函数一例(命令行下及awk脚本中) 2

来源:互联网 发布:报纸的排版软件 编辑:程序博客网 时间:2024/05/21 08:35

http://blog.chinaunix.net/uid-10731919-id-341792.html

awk自定义函数基本格式为,参数arg1、arg2也可无。函数在何时定义并无要求,可以在BEGIN块前,也可以在END块后;除了在主语句块中,何时都可以。

BEGIN{
...}
 
function My_fun (arg1,arg2) {
print arg1
print arg2
}
 
{
主语句
...
My_fun(5,6)
}
 
END{
..}
 
调用方式为 My_fun(5,6)
--------------我是分隔符--------------
 
举一例说明自定义函数的写法,主要是为了说明在shell命令行下写的时候,以及写在awk脚本中的时候需注意的一些格式问题,本例没有用到参数。
本例来自:http://bbs2.chinaunix.net/viewthread.php?tid=1572697&pid=11190055&page=1&extra=#pid11190055
要求打印ip对应的访问时长

IP地址 访问时间 访问时长
211.103.220.197 28/Aug/2009:16:55:14-28/Aug/2009:16:56:22 1分8秒

 
数据文件file

211.103.220.197 - - [28/Aug/2009:16:55:14 +0800] 'GET /web/index.action HTTP/1.1' 200 20816 0.719
211.103.220.197 - - [28/Aug/2009:16:55:26 +0800] 'GET /web/dyanmicStat.action?time=16:58:06 HTTP/1.1' 200 9 0.043
211.103.220.197 - - [28/Aug/2009:16:55:27 +0800] 'GET /web/dyanmicStat.action?time=16:58:08 HTTP/1.1' 200 9 0.044
211.103.220.197 - - [28/Aug/2009:16:55:32 +0800] 'GET /web/dyanmicStat.action?time=16:58:10 HTTP/1.1' 200 9 0.033
211.103.220.197 - - [28/Aug/2009:16:55:32 +0800] 'GET /web/dyanmicStat.action?time=16:58:13 HTTP/1.1' 200 9 0.024
211.103.220.197 - - [28/Aug/2009:16:55:37 +0800] 'GET /web/dyanmicStat.action?time=16:58:15 HTTP/1.1' 200 9 0.027
211.103.220.197 - - [28/Aug/2009:16:55:37 +0800] 'GET /web/dyanmicStat.action?time=16:58:17 HTTP/1.1' 200 9 0.023
211.103.220.197 - - [28/Aug/2009:16:55:38 +0800] 'GET /web/dyanmicStat.action?time=16:58:19 HTTP/1.1' 200 9 0.024
211.103.220.197 - - [28/Aug/2009:16:55:40 +0800] 'GET /web/dyanmicStat.action?time=16:58:21 HTTP/1.1' 200 9 0.140
211.103.220.197 - - [28/Aug/2009:16:55:42 +0800] 'GET /web/dyanmicStat.action?time=16:58:23 HTTP/1.1' 200 9 0.044
211.103.220.197 - - [28/Aug/2009:16:55:44 +0800] 'GET /web/dyanmicStat.action?time=16:58:25 HTTP/1.1' 200 9 0.038
211.103.220.197 - - [28/Aug/2009:16:55:46 +0800] 'GET /web/dyanmicStat.action?time=16:58:27 HTTP/1.1' 200 9 0.028
211.103.220.197 - - [28/Aug/2009:16:55:48 +0800] 'GET /web/dyanmicStat.action?time=16:58:29 HTTP/1.1' 200 9 0.022
211.103.220.197 - - [28/Aug/2009:16:55:50 +0800] 'GET /web/dyanmicStat.action?time=16:58:31 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:55:52 +0800] 'GET /web/dyanmicStat.action?time=16:58:33 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:55:54 +0800] 'GET /web/dyanmicStat.action?time=16:58:35 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:55:56 +0800] 'GET /web/dyanmicStat.action?time=16:58:37 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:55:57 +0800] 'GET /web/dyanmicStat.action?time=16:58:39 HTTP/1.1' 200 9 0.020
211.103.220.197 - - [28/Aug/2009:16:56:00 +0800] 'GET /web/dyanmicStat.action?time=16:58:41 HTTP/1.1' 200 9 0.167
211.103.220.197 - - [28/Aug/2009:16:56:02 +0800] 'GET /web/dyanmicStat.action?time=16:58:43 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:04 +0800] 'GET /web/dyanmicStat.action?time=16:58:45 HTTP/1.1' 200 9 0.698
211.103.220.197 - - [28/Aug/2009:16:56:06 +0800] 'GET /web/dyanmicStat.action?time=16:58:47 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:09 +0800] 'GET /web/dyanmicStat.action?time=16:58:49 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:10 +0800] 'GET /web/dyanmicStat.action?time=16:58:51 HTTP/1.1' 200 9 0.022
211.103.220.197 - - [28/Aug/2009:16:56:12 +0800] 'GET /web/dyanmicStat.action?time=16:58:53 HTTP/1.1' 200 9 0.031
211.103.220.197 - - [28/Aug/2009:16:56:14 +0800] 'GET /web/dyanmicStat.action?time=16:58:55 HTTP/1.1' 200 9 0.020
211.103.220.197 - - [28/Aug/2009:16:56:16 +0800] 'GET /web/dyanmicStat.action?time=16:58:57 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:18 +0800] 'GET /web/dyanmicStat.action?time=16:58:59 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:20 +0800] 'GET /web/dyanmicStat.action?time=16:59:01 HTTP/1.1' 200 9 0.019
211.103.220.197 - - [28/Aug/2009:16:56:22 +0800] 'GET /web/dyanmicStat.action?time=16:59:03 HTTP/1.1' 200 9 0.019
58.33.241.108 - - [29/Aug/2009:17:26:11 +0800] 'GET /web/index.action HTTP/1.1' 200 20845 0.120
58.33.241.108 - - [29/Aug/2009:17:26:14 +0800] 'GET /web/dyanmicStat.action?time=17:28:53 HTTP/1.1' 200 9 0.016
58.33.241.108 - - [29/Aug/2009:17:26:16 +0800] 'GET /web/dyanmicStat.action?time=17:28:55 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:18 +0800] 'GET /web/dyanmicStat.action?time=17:28:57 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:20 +0800] 'GET /web/dyanmicStat.action?time=17:28:59 HTTP/1.1' 200 9 0.018
58.33.241.108 - - [29/Aug/2009:17:26:22 +0800] 'GET /web/dyanmicStat.action?time=17:29:01 HTTP/1.1' 200 9 0.016
58.33.241.108 - - [29/Aug/2009:17:26:24 +0800] 'GET /web/dyanmicStat.action?time=17:29:03 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:26 +0800] 'GET /web/dyanmicStat.action?time=17:29:05 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:28 +0800] 'GET /web/dyanmicStat.action?time=17:29:07 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:30 +0800] 'GET /web/dyanmicStat.action?time=17:29:09 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:32 +0800] 'GET /web/dyanmicStat.action?time=17:29:11 HTTP/1.1' 200 9 0.017
58.33.241.108 - - [29/Aug/2009:17:26:34 +0800] 'GET /web/ngoIndex.action HTTP/1.1' 200 12862 1.114
58.33.241.108 - - [29/Aug/2009:17:27:09 +0800] 'GET /web/queryngobyname.action?name=%E8%A5%BF%E8%97%8F%E7%BD%91 HTTP/1.1' 200 6285 16.879
58.33.241.108 - - [29/Aug/2009:17:27:54 +0800] 'GET /web/querymorengo.action?type=4 HTTP/1.1' 200 5489 0.101
58.33.241.108 - - [29/Aug/2009:17:34:01 +0800] 'GET /web/minyun.jsp HTTP/1.1' 200 1492 0.001

直接在命令行中的处理

awk 'BEGIN{FS=" +|[[]";print "IP地址\t\t\t访问时间\t\t\t\t访问时长"}function cal(){split(s_time,M,":");split(e_time,N,":");time=(N[2]-M[2])*60*60+(N[3]-M[3])*60+N[4]-M[4];if (ip) print ip"\t"s_time"-"e_time"\t"int(time/60)"分"time%60"秒"}$1!=ip{cal();ip=$1;s_time=$5}{e_time=$5}END{cal()}' file

 

写到awk脚本中,调用方法为awk -f my.awk file

awk脚本my.awk

BEGIN {
   FS=" +|[[]"
   print "IP地址\t\t\t访问时间\t\t\t\t访问时长"
      }
if ($1!=ip) {cal();ip=$1;s_time=$5}
  e_time=$5
}
END {
     cal()
    }
function cal () {
   split(s_time,M,":")
   split(e_time,N,":")
   time=(N[2]-M[2])*60*60+(N[3]-M[3])*60+N[4]-M[4]
   if (ip) print ip"\t"s_time"-"e_time"\t"int(time/60)"分"time%60"秒"
               }


0 0
原创粉丝点击