生成多个并行 wget 并将结果存储在 bash 数组中,以便在所有 wget 完成后打印出来

Bra*_*rad 5 linux bash wget array xargs

我在我自己的网站上有一长串 url,列在一个回车分隔的文本文件中。所以例如:

  • http://www.mysite.com/url1.html
  • http://www.mysite.com/url2.html
  • http://www.mysite.com/url3.html

我需要生成许多并行 wget 来两次访问每个 URL,检查并检索特定的标头,然后将结果保存在一个数组中,我想在一个不错的报告中输出该数组。

通过使用以下 xargs 命令,我获得了我想要的部分内容:

xargs -x -P 20 -n 1 wget --server-response -q -O - --delete-after<./urls.txt 2>&1 | grep Caching
Run Code Online (Sandbox Code Playgroud)

问题是如何运行此命令两次并存储以下内容:

  1. 网址命中
  2. 针对缓存标头的 grep 的第一个结果
  3. 针对缓存标头的 grep 的第二个结果

所以输出应该是这样的:

=====================================================
http:/www.mysite.com/url1.html
=====================================================
First Hit: Caching: MISS
Second Hit: Caching: HIT

=====================================================
http:/www.mysite.com/url2.html
=====================================================
First Hit: Caching: MISS
Second Hit: Caching: HIT
Run Code Online (Sandbox Code Playgroud)

等等。

只要标题与 URL 相关联,URLS 出现的顺序就不一定是一个问题。

由于 URL 的数量,我需要并行而不是串行访问多个 URL,否则将花费太长时间。

诀窍是如何获得多个并行 wget 并以有意义的方式存储结果。如果有更合乎逻辑的方法(也许写入日志文件?)

有没有 bash 大师对我如何继续提出任何建议?

Ole*_*nge 3

制作一个小脚本,在给定单个 url 的情况下执行正确的操作(基于 terdon 的代码):

#!/bin/bash

url=$1
echo "=======================================";
echo "$url"
echo "=======================================";
echo -n "First Hit: Caching: ";
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi;
echo -n "Second Hit: Caching: ";      
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi; echo "";
Run Code Online (Sandbox Code Playgroud)

然后使用 GNU Parallel 并行运行此脚本(例如一次 500 个作业):

cat urls.txt | parallel -j500 my_script
Run Code Online (Sandbox Code Playgroud)

GNU Parallel 将确保两个进程的输出永远不会混合 - xargs 不提供保证。

您可以在以下位置找到有关 GNU Parallel 的更多信息:http ://www.gnu.org/s/parallel/

您只需 10 秒即可安装 GNU Parallel:

wget -O - pi.dk/3 | sh 
Run Code Online (Sandbox Code Playgroud)

观看介绍视频:http://www.youtube.com/playlist? list=PL284C9FF2488BC6D1