Bra*_*rad 5 linux bash wget array xargs
我在我自己的网站上有一长串 url,列在一个回车分隔的文本文件中。所以例如:
我需要生成许多并行 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)
问题是如何运行此命令两次并存储以下内容:
所以输出应该是这样的:
=====================================================
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 大师对我如何继续提出任何建议?
制作一个小脚本,在给定单个 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
归档时间: |
|
查看次数: |
1831 次 |
最近记录: |