Извлечение даты из сценария UNIX - PullRequest
1 голос
/ 17 ноября 2010

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

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/G.N.James/netzee/Dice.class HTTP / 1.0" 304 -

153.35.83.237 - - [05 / Oct / 1997: 01: 10: 49 +0100] "GET /User/G.N.James/netzee/Board.class HTTP / 1.0" 304 -

153.35.83.237 - - [05 / Oct / 1997: 01: 10: 50 +0100] "GET /User/G.N.James/netzee/Title.class HTTP / 1.0" 304 -

153.35.83.237 - - [05 / Oct / 1997: 01: 10: 51 +0100] "GET /User/G.N.James/netzee/JavaButton.class HTTP / 1.0" 304 -

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

1 Ответ

1 голос
/ 17 ноября 2010

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

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 может стоить сделать, так как такие вещи, как временный файл, который я использовал выше, могут фактически храниться в хэше в памяти, снова улучшая производительность.1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...