我正在执行一个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 -
非常感谢任何帮助!
答案 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>