awk脚本中,可以按照指定的字符作为分隔符来实现对字符串的分割。
如现有如下字符串:
[02/Mar/2009:12:28:32 +0800] conn=24294969 p=29 SRCH base="PPVId=571788280,cn=PPVContent,l=ipauth,dc=iptv,dc=com" scope=0 filter="(objectclass=*)"
现在要实现对字符串的截取,取方括号[]中的时间字符串,并打印出来。
截取方式是先以]作为分隔符,将前面一段字符串取出来,即有:
[02/Mar/2009:12:28:32 +0800
我只想取前面的日期和时间,不要+0800和[,于是进行substr截取第二个开始2长为20的字符串。
然后我还再将]右边的字符串也打印出来。
脚本如下:
awk -F']' "{print substr($1,1,20) $2;}"
现在我又想在字符串$2中,获取引号(")中的PPVId的这串内容,而我又不想在另外一个awk中实现。于是就可以用split函数来实现这个功能:
split(srcstr, array, field seporator)
srcstr是指要分割的字符串,array是指赋予的变量,field seporator是指分割字符。
于是就有:
awk -F"]" "{split($2,keystr,\");print substr($1,1,20) keystr[2]; }"
理论上讲上面语句应该可以实现,但是由于"是个特殊字符,所以在shell环境中解释会有问题。所以只能放到脚本中了。
下面这个脚本是为分析数据而编写的一个脚本,里面是将那段语句组装成SQL语句。(然后可以让sqlplus可以插入到Oracle中,分析起来比较方便)
#!/bin/awk -f
BEGIN{
FS="]";
sqlhead="insert into w_ldap_analyze(srch_time, srch_str) values(";
iter=1;
}
{
split($2,bstr,"\"");
print sqlhead "to_date('" substr($1,2,20) "', 'dd/mon/yyyy:hh24:mi:ss'),'" bstr[2] "');";
if(iter==5000){
print "commit;";
iter = 1;
}
iter++;
}
END{
print "commit;";
}
由于默认的Oracle可能是中文环境,所以首先还是要将进行数据插入的session改成英文的环境:
alter session set nls_date_language='american';
一个不错的学习地址:http://man.lupaworld.com/content/manage/ringkee/awk.htm
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-558298/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12932950/viewspace-558298/