我正在尝试编写一个脚本,该脚本将按以下顺序执行一些操作:
- 来自“url_list.txt”(换行符)文件中包含的网址列表的 cURL 网站。
- 对于列表中的每个网站,我想对该网站进行 grep 查找“keywords.txt”(换行符)文件中包含的关键字。
我想通过以以下格式(或类似格式)打印到终端来结束:
$URL(包含匹配项):$keyword(进行匹配项)
它需要能够在 Ubuntu 中运行(GNU grep 等)
不需要是cURL和grep;只要有功能就行。
到目前为止我已经得到:
#!/bin/bash
keywords=$(cat ./keywords.txt)
urllist=$(cat ./url_list.txt)
for url in $urllist; do
content="$(curl -L -s "$url" | grep -iF "$keywords" /dev/null)"
echo "$content"
done
但由于某种原因,无论我尝试调整或改变什么,它总是在某种程度上失败。
我怎样才能完成这个任务?
谢谢
最佳答案
我会这样做:
#!/bin/bash
keywords="$(<./keywords.txt)"
while IFS= read -r url; do
curl -L -s "$url" | grep -ioF "$keywords" |
while IFS= read -r keyword; do
echo "$url: $keyword"
done
done < ./url_list.txt
我改变了什么:
- 我用过
$(<./keywords.txt)
阅读keywords.txt
。这不依赖于外部程序(原始脚本中的cat
)。 - 我更改了
for
循环遍历 url 列表,进入while
环形。这保证了我们使用Θ(1)
内存(即我们不必将整个 url 列表加载到内存中)。 - 我从 grep 中删除了/dev/null。
grep
来自/dev/null
独自一人是没有意义的,因为在那里什么也找不到。相反,我调用grep
不带任何参数,以便过滤其stdin
(在本例中,这恰好是curl
的输出)。 - 我添加了
-o
grep
的标志这样它就只输出匹配的关键字。 - 我删除了您捕获
curl
输出的子 shell 。相反,我直接运行该命令并将其输出提供给 while 循环。这是必要的,因为我们可能会获得比每个网址更多的关键字匹配。
关于linux - 使用 Bash 来 cURL 网站并使用 grep 查找关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39584842/