Curl url txt 文件,但从单个文件中单独 grep 每个 url

Curl url txt 文件,但从单个文件中单独 grep 每个 url

我有一个文本文件,其中有很多网址。我在用着

curl -K "$urls" > $output

将输出吐出到我的输出文件中。现在,对于每个单独网址的输出,有一个术语,比方说“抵押”,在该术语下我不需要更多信息。现在我知道我可以使用

sed '/mortgage/q'

删除术语“抵押”下面的所有信息,但如果我像这样在脚本中使用它

curl -K "$urls" | sed '/mortgage/q' > $output

它从 $urls 中第一个 url 的输出中删除第一个“mortgage”实例下方的整个输出中的所有内容,但这会擦除其他 url 中的所有信息(包括其自己的单词“mortgage”实例之前的内容) ") 因为它正在处理整个输出,而不是每个 url。

如何指定 sed '/mortgage/q'分别作用于 url 文件中每个 url 的输出,使其不影响全局输出?

我的 url 文件非常简单,格式如下(这只是一个示例):

URL = http://www.bbc.co.uk/sport/rugby-union/34914911

URL = http://stackoverflow.com/questions/9084453/simple-script-to-check-if-a-webpage-has-been-updated

等等.....

我设想了一种实现此目的的假设方法,但不确定代码 - 有什么方法可以调整该 curl -K "$urls" | sed '/mortgage/q' > $output命令,以便该命令在文件中的每个后续 url 之后循环返回$url,即这样,curl 命令最初只检索第一个文件中的 url,sed对该 url 材料执行命令,附加到$output,然后循环回到文件中的第二个 url,执行 sed 命令,附加到$output等等......这意味着每个 url 所需的材料包含在输出文件中,但每个 url 中“mortgage”下面的内容并未包含在内。我只是不知道如何用代码实现这一点。有任何想法吗?

答案1

这应该分两行完成:

sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} curl -O "{}"
sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} basename "{}"|xargs -I {} sed '/mortgage/q' "{}"

每行的第一个 sed 命令从 url 文件(示例中的 /tmp/curl.conf)中提取 URL。在第一行中,我们使用curl的-O选项将每个页面的输出保存到具有页面名称的文件中。在第二行中,我们重新检查每个文件并仅显示您感兴趣的文本。当然,如果文件中没有出现“mortgage”一词,则将输出整个文件。

这将为您在当前目录中的每个 url 留下一个临时文件。

编辑:

这是一个简短的脚本,可以避免任何剩余文件,它将结果输出到标准输出,您可以根据需要从那里重定向它:

#!/bin/bash
TMPF=$(mktemp)
# sed command extracts URLs line by line
sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf >$TMPF
while read URL; do
    # retrieve each web page and delete any text after 'mortgage' (substitute whatever test you like)
    curl "$URL" 2>/dev/null | sed '/mortgage/q'
done <"$TMPF"
rm "$TMPF"

答案2

即使您的curl 配置文件包含其他选项(例如用户代理、引荐来源网址等),此通用技巧仍然有效。

第一步,假设您的配置文件名为卷曲配置,然后用于awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2 创建一个新的curl配置文件,该文件在每个url/URL下递增地附加不同的输出文件名:

例子:

[xiaobai@xiaobai curl]$ cat curl_config
URL = "www.google.com"
user-agent = "holeagent/5.0"

url = "m12345.google.com"
user-agent = "holeagent/5.0"

URL = "googlevideo.com"
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$ awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config  > curl_config2 
[xiaobai@xiaobai curl]$ cat curl_config2
URL = "www.google.com"
output = dummy/1
user-agent = "holeagent/5.0"

url = "m12345.google.com"
output = dummy/2
user-agent = "holeagent/5.0"

URL = "googlevideo.com"
output = dummy/3
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$ 

然后mkdir dummy创建一个目录来保存这个临时文件。创建inotifywait会话(将 sed '/google/q' 替换为 sed '/mortgage/q'):

[xiaobai@xiaobai curl]$ rm -r dummy; mkdir dummy;
[xiaobai@xiaobai curl]$ rm final 
[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.

打开另一个 bash/终端会话,rm最终的文件(如果存在),然后使用上面第一步中创建的curl_config2 文件运行curl:

[xiaobai@xiaobai curl]$ curl -vLK curl_config2
...processing

现在看一下 inotifywait 会话,它会打印最新的关闭写入文件,sed 它并在完成后立即删除它:

[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.
dummy/1
dummy/3

最后你可以观察你的输出名为最终的, 这[1和3]分隔符是从echo "[$file]">> final上面生成的:

在此输入图像描述

立即删除文件的原因是因为我假设您的输出文件很大,而且必须继续处理许多网址,因此可以节省磁盘空间以立即删除它。

相关内容