通过管道curl连接到awk来下载并解压文件

问题描述 投票:0回答:2

我想下载 HTML 页面此部分的所有文件:

    <td><a class="xm" name="item_1" type="dd" href="/data/24765/dd">Item 1</a></td>
    <td><a class="xm" name="item_2" type="dd" href="/data/12345/dd">Item 2</a></td>
    <td><a class="xm" name="item_3" type="dd" href="/data/75239/dd">Item 3</a></td>

第一个文件的下载链接是

https://foo.bar/data/24765/dd
,由于它是一个zip文件,我也想解压它。

我的脚本是这样的:

#!/bin/bash
curl -s "https://foo.bar/path/to/page" > data.html

gawk 'match($0, /href="\/(data\/[0-9]{5}\/dd)"/, m){print m[1]}' data.html > data.txt

for f in $(cat data.txt); do 
    curl -s "https://foo.bar/$f" > data.zip
    unzip data.zip
done

有没有更优雅的方式来编写这个脚本? 我想避免保存 html、txt 和 zip 文件。

bash curl awk
2个回答
1
投票

bsdtar
命令可以从标准输入解压缩档案,允许您执行以下操作:

curl -s "https://foo.bar/$f" | bsdtar -xf-

当然,您可以将第一个

curl
命令直接通过管道传输到
awk
:

curl -s "https://foo.bar/path/to/page" |
gawk 'match($0, /href="\/(data\/[0-9]{5}\/dd)"/, m){print m[1]}' > data.txt

事实上,您也可以将该管道的输出直接传送到循环中:

curl -s "https://foo.bar/path/to/page" |
gawk 'match($0, /href="\/(data\/[0-9]{5}\/dd)"/, m){print m[1]}' |
while read archive; do
    curl -s "https://foo.bar/$archive" | bsdtar -xf-
done

0
投票

我想避免保存(...)zip 文件。

通常许多 Linux 终端命令都会接受

-
,意思是 在需要文件名的地方使用 stdin。经过粗略搜索后,某些版本的
unzip
似乎不支持此功能(请参阅
© www.soinside.com 2019 - 2024. All rights reserved.