2011-06-09 50 views
1

不确定最有效的方法来做到这一点。 Bash似乎是最简单的,我有一个开始的日期。转换文本文件的列

set -A mAMon N/A Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
sed -e 's/-/ /g' -e 's/\(.*:..\).\{4\}/\1/' -e 's/\.\([0-9]\)/ \1/g' -e 's/\./ /2' inp_file 

我已经figiured了如何提取列,但不知道如何转换

这是我...

代码:

NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 

这是什么我需要....更改日期,删除mil秒,删除ips中的句点,并删除url中的最后一个句点。

代码:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 

感谢

+0

这将是'awk',而不是'sed'工作! – Caleb 2011-06-09 11:04:27

回答

2

一个Perl方式做到这一点:

my %months = (Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6, Jul=>7, Aug=>8, Sep=>9, Oct=>10, Nov=>11, Dec=>12); 
while(<DATA>) { 
    my @part = split; 
    $part[1] =~ s/(\d+)-(\w+)-(\d+)/"$3-".sprintf('%02d',$months{$2})."-$1"/e; 
    $part[2] =~ s/\.\d+$//; 
    $part[3] =~ s/\./ /g; 
    $part[4] =~ s/\.(\w+)$/ $1/; 
    print "@part\n"; 
} 

__DATA__ 
NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 

输出:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
2

用awk:

更新

BEGIN { 
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ") 
    for (i=1; i<=12; i++) { 
     mdigit[month[i]] = sprintf("%02d", i) 
    } 
} 
{ 
#convert date 
    split($2, d, "-") 
    $2 = d[3] "-" d[2] "-" d[1] 
    sub(/[a-zA-Z]+/,mdigit[d[2]],$2) 

# convert time 
    split($3, t, ".") 
    $3=t[1] 

# ip 
    gsub(/\./, " ", $4) 

#url 
    sub(/\./,"_", $5) 
    sub(/\./," ",$5) 
    sub(/_/,".",$5) 

#glue everything together 
    print $1,$2,$3,$4,$5 
} 

产量:

$ awk -f date.awk input 
NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
+0

这也适用,只是无法弄清楚如何反转日期,例如2011-06-04。 – mrlayance 2011-06-09 13:30:03

+0

@mrlayance更新,错过了那部分,对不起! – 2011-06-09 13:41:55

2

PURE bash4方式:

declare -A mon=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Sep]=09 [Oct]=10 [Nov]=11 [Dec]=12) 
while read txt date time ip host 
do 
     IFS='-' read -ra xdate <<< "$date" 
     echo $txt ${xdate[2]}-${mon[${xdate[1]}]}-${xdate[0]} ${time%%.*} ${ip//./ } ${host%.*} ${host##*.} 
done 

所以,例如

declare -A mon=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 [Jul]=07 [Aug]=08 [Sep]=09 [Oct]=10 [Nov]=11 [Dec]=12) 
while read txt date time ip host 
do 
     IFS='-' read -ra xdate <<< "$date" 
     echo $txt ${xdate[2]}-${mon[${xdate[1]}]}-${xdate[0]} ${time%%.*} ${ip//./ } ${host%.*} ${host##*.} 
done <<EOF 
NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com 
NEWDNS 05-Jul-2012 07:00:59.862 11.220.136.217 crx.verisign.sm 
EOF 

会产生:

NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com 
NEWDNS 2012-07-05 07:00:59 11 220 136 217 crx.verisign sm