#perl #shell #sed #awk
#perl #оболочка #sed #awk
Вопрос:
Не уверен, что это самый эффективный способ сделать это. 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
Я выяснил, как извлекать столбцы, но не уверен, как конвертировать
Это то, что у меня есть…
Код:
NEWDNS 04-Jun-2011 06:00:59.762 10.220.136.217 crl.verisign.com
Это то, что мне нужно…. Измените дату, удалите миллионы секунд, удалите точки в IP-адресах и удалите последнюю точку в URL-адресе.
Код:
NEWDNS 2011-06-04 06:00:59 10 220 136 217 crl.verisign com
Спасибо
Комментарии:
1. Это будет работа для
awk
вместоsed
!
Ответ №1:
Способ 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('d',$months{$2})."-$1"/e;
$part[2] =~ s/.d $//;
$part[3] =~ s/./ /g;
$part[4] =~ s/.(w )$/ $1/;
print "@partn";
}
__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("d", 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
Комментарии:
1. Это тоже работает, просто не могу понять, как изменить дату, например, 2011-06-04.
Ответ №3:
ЧИСТЫЙ способ 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