【发布时间】:2013-03-01 22:45:19
【问题描述】:
我想筛选文本文件以查找可疑活动。我有点熟悉 bash 脚本,包括 grep、sed 和 awk。我对 stackoverflow.com、tldp.org 等的研究以及与同事的交谈表明 perl 和 python 最适合我的任务,但我对这些脚本语言的经验为零。
欢迎使用各种脚本、编译或解释语言输入。由于我的限制,请在代码中添加cmets,使我能够快速理解和学习该语言。
好的,任务是对按列排序的项目进行排序和计数。我 / 可以 / 使用 grep、awk 和 sed 完成其中的一部分。不幸的是,递归方面(我认为这个问题)让我很难过。
输入文本已排序,两列 IP 地址(在下面的示例中进行了简化)和一列用于目标端口(所有可能的值)。这个文件的大小可能是几兆字节,但一次可能永远不会超过 250MB,因此不需要绝对的效率。简单就是。
SIP DIP DPt
111.100 200.150 80
111.100 200.150 443
111.100 200.155 22
111.100 200.155 80
111.100 200.155 443
111.100 200.160 80
111.100 200.165 139
111.100 200.165 443
111.100 200.165 512
115.102 225.150 80
115.102 225.150 137
115.102 225.150 443
120.125 250.175 23
120.135 250.145 23
125.155 250.165 80
125.155 250.165 139
125.155 250.175 1023
我正在工作的代码(从内存中起草......目前不在我的 linux 机器上)类似于这个......
#!/bin/bash
declare -i counter=0
SIP=null # current source ip.
SIP_last=null # for last ip address processed.
SIP_next=null # not found a use for this, yet.
# sorting usually reqs three vars, so here it is.
for SIP in `zcat textfile.gz | awk '{ if ($3 <1024) print $1,$2,$3}'` do
# Ensure I count the first item. This was problematic at first.
if [[ "$SIP_last" == null ]] then
SIP_last=$SIP
counter=counter+1 # counter=+ didn't work reliably.
# Do something useful. As shown, it works.
if [[ "$SIP" == "$SIP_last" ]] then
counter=counter+1
if [[ "$SIP != "$SIP_last" ]] then
echo SIP: $SIP_last Counter: $counter # DIP code has not yet been added.
SIP_last=$SIP
# Ensure I always catch the last item. Still working on this issue.
# XXX
done
使用上面提供的输入,输出应如下所示...
SIP DIP Ct Ports
> 2 < 1024
111.100 200.150 80, 443
111.100 200.155 20, 80, 443
111.100 200.165 139, 443, 512
115.102 225.150 80, 137, 443
查看输出,您可以看到问题的症结在于仅报告 DIP 计数 > 2 和端口
再次,这是凭记忆,所以请原谅编码错误。感谢您的帮助。
艾伦。
【问题讨论】:
-
您使用了错误的工具来完成这项工作。只学习python的基础知识会让这件事变得容易得多。如果您更改问题以接受 Python 中的帮助,我很乐意提供帮助
-
shell 是一个环境,可以从中调用工具和操作文件和进程。它不是一种用于编写脚本来解析文本文件的语言 - 有为该工作设计的工具。在这种情况下,awk 将是您最好的选择,因为它存在于所有 UNIX 安装中,并且具有专门为处理文本文件而设计的小型、简单的语言。
-
哥伦,你是对的,当然。让我看看我的爱好箱是否安装并启用了 python。今天晚些时候会告诉你。谢谢...艾伦。
-
艾德,你也是对的。也许是语义。我可能将 shell 脚本 (bash) 视为一种编程语言,而不是用于自动执行任务的命令解释器框架。我会试试你的建议,让你知道
-
@goron 我修改了问题以请求 bash 脚本以外的语言的帮助(承认 bash 脚本不是一种语言)。感谢您愿意帮助完成这项任务。
标签: sorting count awk grep text-files