Ruby:我应该如何从数组中删除重复的行?

时间:2014-04-04 15:24:16

标签: ruby-on-rails ruby

我可能没有使用正确的术语但是这里......

我在仪表板应用上显示IPS警报,并且有许多重复的行。例如,如果一个脚本小子试图暴力破坏RDP服务器,我可以得到150个警报,但可以减少到大约5,因为他们要追踪的主机数量。因此,我尝试删除重复的警报,并且我希望使用sid,src_addr和dst_addr作为我的指标,以确定它们是否重复。

目前我使用以下代码显示@filtered_snort_detail_query

This is my view

<% if @filtered_snort_detail_query.count > 0 %>
  <table>
      <tr>
        <th>Timestamp</th>
        <th>Tag Info</th>
        <th>Message</th>
      </tr>
      <% @filtered_snort_detail_query.each do |d|
        text_msg = d['_source']['message']
        if d['_source']['message'].nil?
        end
      %>
          <tr>
            <td class='timestamp'><%= d['_source']['@timestamp'].to_time %></td>
            <td class='tags'><%= d['_source']['tags'] %></td>
            <td class='message'><%= text_msg %></td>
          </tr>
      <% end %>

    </table>
<% else %>
    <div> No Results Returned. </div>
<% end %>

Here is my controller

    if @es_snort_detail_query.count > 0
      @filtered_snort_detail_query = Array.new
      @es_snort_detail_query.each do |ips_detail|
        next if ips_detail['_source']['type'] != 'snort-ips'
        next if ips_detail['_source']['@timestamp'] < @ts
        @filtered_snort_detail_query.push(ips_detail)
      end
     end

以下是我认为我需要做的事情来获取比较控制器中的行所需的指标。 我只是不确定查看每一行@filtered_snort_detail_query的最佳方法,并使用这些参数构建一个新数组以在我的视图中显示:

向我显示所有行,但如果sid_datasrc_ip_datadst_ip_data发生两次或更多次,则不会显示。

    if @es_snort_detail_query.count > 0
      @filtered_snort_detail_query = Array.new
      @es_snort_detail_query.each do |ips_detail|
        next if ips_detail['_source']['type'] != 'snort-ips'
        next if ips_detail['_source']['@timestamp'] < @ts
        @filtered_snort_detail_query.push(ips_detail)
      end
      if @filtered_snort_detail_query.count > 0
        ip_src = Array.new
        ip_dst = Array.new
        sid = Array.new
        @filtered_snort_detail_query.each do |find_ip, find_sid|
          unless find_ip.nil?
            sid_data = find_sid.scan(/\[\d+\:\d+\:\d+\]/)
            src_ip_data = find_ip.scan(/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/)
            dst_ip_data = find_ip.scan(/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/)
            sid.push(sid_data[0]) unless sid_data[0].nil?
            ip_src.push(src_ip_data[0]) unless src_ip_data[0].nil?
            ip_dst.push(dst_ip_data[1]) unless dst_ip_data[1].nil?
          end

        end
      end
    end

1 个答案:

答案 0 :(得分:0)

很抱歉,如果我误解了这个问题。

如果数组中有一堆对象,并且您希望根据其属性的子集删除重复项,则可以将uniq方法与块一起使用:

queries.uniq do |query|
  [query.sid_data, query.src_ip_data, query.dst_ip_data]
end

它将根据块中创建的数组比较查询,并删除重复项。


转到http://www.compileonline.com/execute_ruby_online.php,复制并粘贴以下代码,然后点击左上角的执行脚本。

queries = [
  { :a => "ab", :b => "ba" },
  { :a => "ab", :b => "xy" },
  { :a => "xy", :b => "xy" }
]

unique_queries = queries.uniq do |q|
  q[:a]
end

puts unique_queries

请参阅?比较仅基于:a键的值完成。这是相同的原则。