awk之二次分隔函数

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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值