awk之二次分隔函式

regonly1發表於2009-03-02

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';

一個不錯的學習地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-558298/,如需轉載,請註明出處,否則將追究法律責任。

相關文章