【问题标题】:A task on the *nix command line*nix 命令行上的任务
【发布时间】:2021-07-11 17:41:36
【问题描述】:

有一个文件,其行如下:host ip page。你需要输出 10 个比较常见的 IP 地址。

我想解决一个小问题。 请指教,你觉得这个解决方案怎么样?

sort list|uniq -c|sort -r|head -n 10 

比如我有源文件(list.txt):

localhost1 144.12.34.245 page1
localhost2 144.12.34.241 page2
localhost3 144.12.34.242 page3
localhost4 144.12.34.243 page4
localhost4 144.12.34.243 page4
localhost4 144.12.34.243 page4
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5

同一个ip地址可以有不同的hosts和pages。它们由一个空格分隔。

例如:

(localhost5 144.12.34.244 page5, localhost5 144.12.34.244 第6页

(localhost1 144.12.34.244 page5, localhost5 144.12.34.244 第6页

(localhost5 144.12.34.244 page5, localhost5 144.12.34.144 第5页)

执行命令后得到结果:

4 localhost5 144.12.34.244 page5
3 localhost4 144.12.34.243 page4
1 localhost3 144.12.34.242 page3
1 localhost2 144.12.34.241 page2
1 localhost1 144.12.34.245 page1

几乎完美。 但我只想输出一个 IP 地址列表。没有主机和页面:

144.12.34.244
144.12.34.243
144.12.34.242
144.12.34.241
144.12.34.245

【问题讨论】:

  • 您是否要求进行代码审查?那将是错误的网站。有什么不按您的意愿工作吗?你有问题吗?
  • @BenjaminW。很抱歉我没有很好地准备问题。我对我的问题做了一些修改。
  • 您对sedawk 满意吗?
  • 我建议sed '...' list | sort | uniq -c | sort -r | sed '...'
  • 对于相同的主机名和 IP 地址组合,是否可以有不同的 pageX 值? (localhost5 144.12.34.344 page5, localhost5 144.12.34.344 page6) 你能有不同的主机名和 IP 地址组合吗?具有多个 IP 地址的主机? (localhost5 144.12.34.344 page5, localhost5 144.12.34.144 page5) 如果任何答案是“是”,请修改您的示例输入以显示此类情况。添加与输入匹配的预期输出。我可以假设您想忽略主机名和页面列吗?列是否由单个空格分隔?顺便说一句:IP 地址字节

标签: sorting unix uniq


【解决方案1】:

假设你想忽略主机名和页面字段,只计算 IP 地址,你可以使用

awk '{print $2}'  input |sort|uniq -c|sort -nr|head -10|awk '{print $2}'

示例输入:

localhost1 144.12.34.245 page1
localhost2 144.12.34.241 page2
localhost3 144.12.34.242 page3
localhost4 144.12.34.243 page4
localhost4 144.12.34.243 page4
localhost4 144.12.34.243 page4
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page5
localhost5 144.12.34.244 page6
localhost1 144.12.34.244 page5
localhost5 144.12.34.244 page6
localhost5 144.12.34.244 page5
localhost5 144.12.34.144 page5
localhost5 144.12.34.0 page5
localhost5 144.12.34.1 page5
localhost5 144.12.34.2 page5
localhost5 144.12.34.3 page5
localhost5 144.12.34.4 page5
localhost5 144.12.34.5 page5
localhost5 144.12.34.6 page5
localhost5 144.12.34.7 page5
localhost5 144.12.34.8 page5
localhost5 144.12.34.9 page5

结果输出:

144.12.34.244
144.12.34.243
144.12.34.9
144.12.34.8
144.12.34.7
144.12.34.6
144.12.34.5
144.12.34.4
144.12.34.3
144.12.34.245

【讨论】:

  • 是的,确实如此!我只想考虑唯一的 IP 地址。其余的可以忽略。
  • 感谢您如此详细地考虑我的问题!我很高兴!
  • @Mardaunt 正如我已经写过的,最好扩展您的示例输入以显示所有可能的变体。如果此答案解决了您的问题,您可以通过单击复选标记接受它。
  • 是的。现在有问题!
【解决方案2】:

你在你的命令之后添加这个:

| awk -F " " '{print $3}'

这意味着:

-F " "       : separate your data in columns, the separator is a space.
'{print $3}' : this awk script says only to write the third column.

【讨论】:

  • 一个很棒的补充!
猜你喜欢
  • 2011-04-04
  • 2012-10-07
  • 2019-10-27
  • 1970-01-01
  • 2017-06-26
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多