2010-11-17 3 views
1

Я выполняю сценарий UNIX, который проходит через файл журнала и выводит узлы, из которых произошли веб-соединения. Я достичь с помощью следующего сценарияUNIX script date extract

if [ "$1" = "hosts" ]; then 
grep "$2" $logs | awk '{print $1}' | uniq > templist 

lines=`wc templist | awk '{print $1}'` 
while [ "$number" -le "$lines" ] 
    do 
    hostip=`sed -n "$number p" templist` 
    `nslookup -sil "$hostip" | grep -i "name" | awk '{print $4}' >> lookup` 
    number=`expr $number + 1` 
done 

echo " " 
echo " Host IP Address " 
echo " --------------- " 

paste templist lookup 
rm lookup 
rm templist 
exit 1 
fi 

Однако, меня я не могу понять, как вывести даты, а также. Я пытался что-то вдоль линий:

if [ "$1" = "hostsdate" ]; then 
grep "$2" $logs | awk '{print $1}'| uniq > templist 
grep "$2" $logs | awk '{print $4,$5}'| uniq > datelist 

lines=`wc templist | awk '{print $1}'` 
while [ "$number" -le "$lines" ] 
    do 
    hostip=`sed -n "$number p" templist` 
    `nslookup -sil "$hostip" | grep -i "name" | awk '{print $4}' >> lookup` 
    number=`expr $number + 1` 
done 

echo " " 
echo " Access Date     Host IP Address Host Name " 
echo " --------------------------------------------------------- " 

paste templist lookup >final 
paste datelist final 
rm lookup 
rm templist 
rm final 
rm datelist 
exit 1 
fi 

Но это не сработало .... формат файла журнала я работаю выглядит следующим образом:

153.35.83.237 - - [05/Oct/1997: 01: 10: 48 +0100] "GET /User/GNJames/netzee/Dice.class HTTP/1.0" 304 -

153.35.83.237 - - [05/Oct/1997 : 01: 10: 49 +0100] «GET /User/GNJames/netzee/Board.class HTTP/1.0» 304 -

153.35.83.237 - - [05/Oct/1997: 01: 10: 50 + 0100] "GET /User/GNJames/netzee/Title.class HTT Р/1.0" 304 -

153.35.83.237 - - [05/Окт/1997: 01: 10: 51 +0100] "GET /User/GNJames/netzee/JavaButton.class HTTP/1.0" 304 -

Любая помощь была бы принята с благодарностью!

ответ

1

Это делает поиск через каждую строку и возвращает что-то вроде того, что вы хотите:

awk '{ print $1,$4,$5 }' access_log | while read ip dt1 dt2 
do 
     echo $dt1 $dt2 $ip `host $ip | awk '{ print $5}'` 
done 

... однако, я пытаюсь работать именно то, что вывод, который вы пытаетесь получить? Вам нужна последняя дата/время для каждого IP-адреса? Я замечаю, что вы делаете uniq по значениям - пытаетесь выяснить, почему это так, или просто уменьшить количество выполняемых запросов? Если это последнее, то вы можете сделать это:

TMPFILE=hosts.$$ 
LOGFILE=x.log 

echo 'Creating lookup tempfile...' 
awk '{ print $1 }' $LOGFILE | sort | uniq | while read ip 
do 
     echo $ip `host $ip | awk '{ print $5 }'` 
done > $TMPFILE 

echo 'Date/host report...' 
awk '{ print $1,$4,$5 }' $LOGFILE | uniq | while read ip dt1 dt2 
do 
     echo $dt1 $dt2 $ip `grep "^$ip" $TMPFILE | awk '{ print $2 }'` 
done 

rm $TMPFILE 

Там может быть лучший способ снова (например, с Perl) - это полностью зависит от размера вы обработки лог-файл. Если это, скорее всего, станет большим файлом, то делегирование некоторой части работы perl может стоить того, что бы сделать так, как будто временный файл, который я использовал выше, действительно может быть сохранен в хэш-памяти в памяти, что еще раз улучшит производительность.

+0

Большое спасибо, я пытался уменьшить количество поисков. Я пошел с первым подходом. Также я заметил, что вы используете хост вместо nslookup. Это, чтобы обойти ошибки разрешения адресов nslookup? –

+0

Я использую хост просто потому, что его выход по умолчанию проще разобрать, поскольку он просто выдает одну строку :-) –