【问题标题】:Linux script to return domains on a web page在网页上返回域的 Linux 脚本
【发布时间】:2012-07-28 20:33:09
【问题描述】:

我的任务是回答这个问题: 编写一个 bash 脚本,将 URL 作为其第一个参数,并在 URL 的 HTML 中打印出每个主机/域的链接数的统计信息。

例如,给定一个像 www.bbc.co.uk 这样的 URL,它可能会打印出类似的东西

www.bbc.co.uk: 45
bbc.com: 1
google.com: 2
Facebook.com: 4

也就是说,它应该分析页面的 HTML,拉出所有链接,检查 href 属性,确定哪些链接是指向同一个域的(当然是那个),哪些是外来的,然后生成本地和远程的统计信息。

规则:您可以在脚本中使用任何一组标准 Linux 命令。您不得使用任何高级编程语言,例如 C、Python 或 Perl。但是,您可以使用 awk、sed 等。

我想出了如下解决方案:

#!/bin/sh

echo "Enter a url eg www.bbc.com:"
read url
content=$(wget "$url" -q -O -)
echo "Enter file name to store URL output"
read file
echo $content > $file
echo "Enter file name to store filtered links:"
read links
found=$(cat $file | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | sort | uniq | awk '/http/' > $links)
output=$(egrep -o '^http://[^/]+/' $links | sort | uniq -c > out)
cat out

然后我被告知“我必须查看数据,然后检查您的程序是否能够令人满意地处理所有场景。这会报告 URL,但不会报告域” 有没有人可以帮助我或为我指明正确的方向,以便我能够实现我的目标?我错过了什么或脚本没有做什么?我以为我已经让它按要求工作了。

【问题讨论】:

  • C 比 shell 脚本高级吗?
  • 说明书上说的。我也不明白怎么做。 :)
  • 你应该避免大量的临时文件,或者确保你事后清理。此外,通常您只需从一开始就规范化输入,即当您提取 href 时,将其缩减为仅域名,然后将其提供给 sort。一个强烈的提示是,如果您将awk 用于任何事情,请尽可能多地使用awk 并摆脱grep | cut | yada yada 的干扰。
  • 请记住,其他 HTML 标记会调用其他域中托管的内容,例如 <img><script><iframe> 等。我建议您也跟踪它们。

标签: linux bash


【解决方案1】:

脚本的输出是:

      7 http://news.bbc.co.uk/
      1 http://newsvote.bbc.co.uk/
      1 http://purl.org/
      8 http://static.bbci.co.uk/
      1 http://www.bbcamerica.com/
     23 http://www.bbc.com/
    179 http://www.bbc.co.uk/
      1 http://www.bbcknowledge.com/
      1 http://www.browserchoice.eu/

我认为他们的意思是它应该看起来更像:

      7 news.bbc.co.uk
      1 newsvote.bbc.co.uk
      1 purl.org
      8 static.bbci.co.uk
      1 www.bbcamerica.com
     23 www.bbc.com
    179 www.bbc.co.uk
      1 www.bbcknowledge.com
      1 www.browserchoice.eu

【讨论】:

  • ... 或者甚至将来自 news、newsvote 和 www.bbc.co.uk 的结果汇总为 bbc.co.uk 的一个数字;但在一般情况下,这很难做到(你怎么知道我刚刚编的www.in.c.a.aq 之类的顶级域名是什么?)
  • @tripleee 是的,这也发生在我身上,但 OP 描述并没有定义讲师认为的域。
  • 好的,是的,这很难做到,但问题是如何让它做到这一点。迈克尔首先我希望我的输出像你在第二个选项中建议的那样。我可以让我的代码做到这一点吗?我试过了,这不是一件容易的事
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2016-02-02
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多