【问题标题】:Sort / Uniq pipethrough usage排序/唯一管道通过使用
【发布时间】:2014-06-04 04:02:01
【问题描述】:

所以我试图通过 HTTP 错误日志进行 grep,取出结果中的所有 IP,然后对它们进行排序,以便它们按匹配总数的顺序显示(忽略任何“单个”匹配),以便我知道要阻止哪些 IP。

到目前为止我的命令:

grep "File does not exist" local1.log | awk '{print $13;}' | sort -g | uniq -c | sort -n -k 1,1

上述命令的输出:

   5599 200.71.211.187]
   6439 91.102.160.191]
  10448 84.92.84.166]
  14181 27.159.226.198]
  20170 93.90.177.167]

现在我有一种感觉,我正在做太多的管道传输和 uniq/sort 的某种混蛋使用......

我之前的尝试是:

grep "File does not exist" local1.log | awk '{print $13;}' | uniq -dc | sort -n -k 1,1

这给了我来自 uniq 的重复输出,然后按排序中的总“匹配”排序。

TL;DR:

必须有一种更...优雅的方式来完成我正在尝试做的事情,有什么建议吗? ^^

Edit -sort -u 给了我一个垃圾列表,其中包含单个匹配项,例如:

  1 99.92.71.147]
  1 99.92.86.7]
  1 99.93.12.115]
  1 99.9.4.241]
  1 99.95.215.81]
  1 99.95.96.7]
  1 99.99.113.194]
  1 99.99.185.1]

【问题讨论】:

    标签: regex sorting awk grep uniq


    【解决方案1】:

    试试这个:

    awk '/File does not exist/{count[$13]++}END{for(ip in count) print count[ip],ip}' local1.log 
    

    我们在这里所做的是创建一个数组,将 ip 地址存储为键并不断增加它。在 END 块中,我们遍历数组并打印我们看到 ip 和 ip 本身的次数。

    您可能必须通过管道对其进行排序以按计数排序输出。

    【讨论】:

    • @nom 太好了,很高兴我能帮上忙。我必须说,作为该网站的新人,您在发布问题方面做得非常出色。你展示了你的尝试和改进你的尝试的动力。你展示了你想要的输出,并探索了可能对你不起作用的答案。 +1 你的问题。祝你好运!
    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多