UNIX脚本日期提取

时间:2010-11-17 19:05:38

标签: unix logging

我正在执行一个UNIX脚本,该脚本通过日志文件并输出发生Web连接的主机。我用以下脚本实现了这个目的

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 个答案:

答案 0 :(得分: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可能是值得做的,因为我上面使用的临时文件实际上可以保存在内存中的哈希中,从而再次提高性能。 / p>