【发布时间】: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>等。我建议您也跟踪它们。