![如何使用curl和grep命令抓取网站的头部部分?](https://linux22.com/image/97927/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8curl%E5%92%8Cgrep%E5%91%BD%E4%BB%A4%E6%8A%93%E5%8F%96%E7%BD%91%E7%AB%99%E7%9A%84%E5%A4%B4%E9%83%A8%E9%83%A8%E5%88%86%EF%BC%9F.png)
我正在参加 Linux+ 期中考试,我遇到了一个问题,我应该复制包含标签的头部部分并将其输出到文件中。我的期中考试将于 5 日到期,因此如果有人向我展示在 grep 头部部分和标签时使用的正确代码,那将会非常有帮助。我尝试过: curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
但是当我cat该文件时,它会说<head>
,不包括头部或标签。那么我应该输入什么才能获得文件的正确输出呢?
答案1
这比你想要做的要复杂一些。
首先,您的命令存在一些语法问题。这curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
应该是:
curl www.hackthissite.org | grep "<head>" > ~/data/public/myfirstname\ mylastname/head.txt
但即使它不会做你想要的事情,因为你只是 grep 头部开始标签,而不是它和结束标签之间的内容。
我想出了这个:
curl www.hackthissite.org > TEMPORARYFILE.txt; grep -A $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1))) "<head>" TEMPORARYFILE.txt > ~/data/public/myfirstname\ mylastname/head.txt; rm TEMPORARYFILE.txt
所以,按部分来说:
grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1
这将获取结束标记所在的行号。这同样适用于grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1
,但对于开始标签。
然后我们有$(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1)))
,它应该计算开始标签和结束标签之间有多少行。
-A
它与选项一起使用grep
,它使我们能够控制要打印的匹配项后的行数。因此它将搜索起始头标签并打印它和结束标签之间的所有行。
答案2
使用呆呆:
curl -s www.hackthissite.org | awk '/<\<head>/,/<\/head>/ {print}'