linux - 使用 Bash 来 cURL 网站并使用 grep 查找关键字

标签 linux bash shell curl grep

我正在尝试编写一个脚本,该脚本将按以下顺序执行一些操作:

  1. 来自“url_list.txt”(换行符)文件中包含的网址列表的 cURL 网站。
  2. 对于列表中的每个网站,我想对该网站进行 grep 查找“keywords.txt”(换行符)文件中包含的关键字。
  3. 我想通过以以下格式(或类似格式)打印到终端来结束:

    $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/

相关文章:

c - 无法以读取模式打开消息队列 (mq_open())

linux - 用于查找两个文件之间出现次数增加的 Shell 脚本

bash - 在 bash 脚本中使用空格拆分句子

bash - 查找多个文件的公共(public)行

arrays - 如何修复 bash 脚本中的数组错误?

无法在我的 Linux 迷你调试器中设置断点

php - 使用php脚本编辑dhcp配置文件

linux - awk 语句的语法问题

bash - For 循环获取 "find"命令的结果

linux - .bashrc 中的 shopt -s extdebug 在脚本文件中不起作用