Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 对文本文件列中的多个值进行计数和排序_Sorting_Count_Awk_Grep_Text Files - Fatal编程技术网

Sorting 对文本文件列中的多个值进行计数和排序

Sorting 对文本文件列中的多个值进行计数和排序,sorting,count,awk,grep,text-files,Sorting,Count,Awk,Grep,Text Files,我想筛选文本文件,寻找可疑活动。我对bash脚本有点熟悉,包括grep、sed和awk。我在stackoverflow.com、tldp.org等网站上的研究以及与同事的交谈表明,perl和python最适合我的任务,但我对这些脚本语言没有任何经验 欢迎使用各种脚本语言、编译语言或解释语言输入。由于我的限制,请在代码中添加注释,使我能够快速理解和学习该语言 好的,任务是对按列排序的项目进行排序和计数。我/可以/使用grep、awk和sed完成其中的一部分。不幸的是,递归方面(正如我所看到的问题)

我想筛选文本文件,寻找可疑活动。我对bash脚本有点熟悉,包括grep、sed和awk。我在stackoverflow.com、tldp.org等网站上的研究以及与同事的交谈表明,perl和python最适合我的任务,但我对这些脚本语言没有任何经验

欢迎使用各种脚本语言、编译语言或解释语言输入。由于我的限制,请在代码中添加注释,使我能够快速理解和学习该语言

好的,任务是对按列排序的项目进行排序和计数。我/可以/使用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
#/bin/bash
声明-i计数器=0
SIP=null#当前源ip。
SIP_last=null#表示最后处理的ip地址。
SIP_next=null#还没有找到它的用途。
#排序通常需要三个变量,就是这样。

对于'zcat textfile.gz | awk'{if($3)中的SIP以及您发布的示例输入文件:

$ awk '
NR==1 { print; next }
$3 < 1024 {
   key = $1 "\t" $2
   if (!seen[key,$3]++) {
      cnt[key]++
      vals[key] = vals[key] sep[key] $3
      sep[key] = ", "
   }
}
END { for (key in cnt) if (cnt[key] > 1) print key "\t" vals[key] }
' file
SIP        DIP        DPt
111.100 200.155 22, 80, 443
111.100 200.165 139, 443, 512
125.155 250.165 80, 139
115.102 225.150 80, 137, 443
111.100 200.150 80, 443
$awk'
NR==1{打印;下一个}
$3 < 1024 {
密钥=$1“\t”$2
如果(!seen[key,$3]++){
cnt[键]++
VAL[键]=VAL[键]九月[键]$3
sep[键]=“,”
}
}
结束{for(cnt中的键)如果(cnt[key]>1)打印键“\t”VAL[key]}
"档案"
SIP DIP DPt
111.100 200.155 22, 80, 443
111.100 200.165 139, 443, 512
125.155 250.165 80, 139
115.102 225.150 80, 137, 443
111.100 200.150 80, 443

如果这不是你想要的,请澄清。

你使用了错误的工具来完成这项工作。学习python的基础知识会让这变得非常简单。如果你把问题改为接受python的帮助,我很乐意帮助shell是一个调用工具、操作文件和进程的环境。它不是一种语言在编写脚本来解析文本文件的过程中,有专门为这项工作设计的工具。在这种情况下,awk将是您的最佳选择,因为它存在于所有UNIX安装中,并且有一种专门为处理文本文件而设计的小而简单的语言。Goron,当然,您是对的。让我看看我的爱好框中是否安装并启用了python。Wi今天晚些时候我会告诉你的。谢谢……艾伦。埃德,你也是对的。也许是语义学。我可能会谈论shell脚本(bash)就好像它们是一种编程语言,而不是一种用于自动化任务的命令解释器框架。我会试试你的建议,让你看看k@goron我修改了这个问题以请求bash脚本以外语言的帮助(承认bash脚本不是一种语言)。感谢您愿意帮助完成此任务。Ed,感谢您的回复。很抱歉延迟提供反馈。昨天检查我的输入文件我确认。请重试…Ed,感谢您的回复。很抱歉延迟提供反馈。昨天检查我的输入文件我确认输入行包含许多dupl输入SIP、DIP和DPt。输入代码后,结果是100.111 200.155 80、80、80、80、80、80。您的输出100.111.200.155 22、80、443是所需的输出。我尝试修补代码,但未成功:(谢谢您的帮助。@Allen我更新了我的答案,现在就试试。不过,要获得更多帮助,请更新您的问题,使其包含有代表性的输入和预期的输出,包括您提到的重复项。
$ awk '
NR==1 { print; next }
$3 < 1024 {
   key = $1 "\t" $2
   if (!seen[key,$3]++) {
      cnt[key]++
      vals[key] = vals[key] sep[key] $3
      sep[key] = ", "
   }
}
END { for (key in cnt) if (cnt[key] > 1) print key "\t" vals[key] }
' file
SIP        DIP        DPt
111.100 200.155 22, 80, 443
111.100 200.165 139, 443, 512
125.155 250.165 80, 139
115.102 225.150 80, 137, 443
111.100 200.150 80, 443