【发布时间】:2018-09-13 13:14:00
【问题描述】:
我有这个非常大的身份验证日志文件。我已将它与 SED 和 AWK 命令配对到我需要的信息。现在,我需要在用户连接和从服务器断开连接时配对,以记录用户登录的时间和时间。
在用户登录时的日志中,您可以看到他们的用户名和 IP 端口。当他们注销时,您只能看到 IP 端口。所以我需要匹配那些IP端口,然后从它们连接的线路中吐出信息。
日志文件如下所示:
Date,time,Username,Viewer,IPPort <br>
20180911,12:00,Chris,New,55567 <br>
20180911,12:30,Tom,New,55577 <<<<<-Connections <br>
20180911,12:45,Larry,New,55587 <br>
20180911,14:00,,,55567 <br>
20180911,15:30,,,55577 <<<<<-When user logs off <br>
20180911,16:45,,,55587 <br>
我的第一个想法是使用嵌套的 while 循环。因此,转到每一行,然后在该行上再次遍历每一行以查找匹配项。这确实会遍历文件并匹配内容,但它会在嵌套循环中根据自身重新检查顶行。必须有一种更清洁的方法来完成这项工作。
这就是我的循环当前的样子。
INPUT=firstreport.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read Date Time Username Viewer IP
do
echo "IP : $IP"
IPCHECK=$IP
while read Date Time Username Viewer IP
do
if [[ $IPCHECK == $IP ]]; then
echo "Match : $IP"
fi
done < $INPUT
done < $INPUT
IFS=$OLDIFS`
任何关于我如何完成这项工作的建议将不胜感激。我的最终目标是制作一份可以转储到 Excel 中并显示用户活动地图的报告。
谢谢你, 克里斯
【问题讨论】:
-
这些端口是否相当独特?如果是这样,按端口排序似乎可以解决您的问题。
-
是的,所有端口都应该是唯一的,我可以通过某种方式使用 sort 吗?
-
嗯,我刚刚注意到示例中两种类型的日志的端口不在同一列中(第 5 用于登录,第 4 用于注销)但您的代码似乎没有尝试要处理这个,是不是样本有错误?
-
假设端口总是在第 5 个逗号分隔的字段中,下面的排序应该给你一个输出,其中具有相同端口的条目是连续的:
sort -t, -k 5.1。样品运行here -
是的,这是我的示例中的一个错误,它应该保留在整个文件的第 5 列中。惊人的!我会试一试。
标签: linux bash shell loops while-loop