cat 和管道运行命令不需要两个参数

cat 和管道运行命令不需要两个参数

我一直在使用这个命令:

cat urls.txt | xargs -n 1 -P 10 wget -q

下载 URL 的文本文件。当我的 URL 文件如下时,此方法很有效:

http://domain1.com/page.html
http://domain2.com/page.html
http://domain3.com/page.html

但是我现在需要下载 URL 的文本文件并发布数据,例如:

--post-data '1=1' http://domain1.com/page.html
--post-data '1=1' http://domain2.com/page.html
--post-data '1=1' http://domain3.com/page.html

当使用上述 cat 命令时,它会尝试下载 URL,然后将帖子数据作为 URL 下载。例如,在上面的例子中,它将下载http://domain1.com/page.html然后尝试下载 --post-data 1=1,然后http://domain2.com/page.html等等。

有没有办法让 cat 仅发送 URL 文件的每一行?

更新:我发现通过添加空格来达到这样的效果:

--post-data '1=1'\ http://domain1.com/page.html

使其被视为一个 url,但 -- 似乎已从 --post-data 参数中剥离。

答案1

要使xargs命令对每一行输入都运行一次,请为其提供选项-L 1(并删除-n 1选项,因为它们是互斥的)。xargs 的标准文档说:

-L number
The utility shall be executed for each non-empty number lines of arguments
from standard input. A line is considered to end with the first <newline>
unless the last character of the line is a <blank>; a trailing <blank>
signals continuation to the next non-empty line, inclusive.

答案2

打开终端并运行:

cat urls.txt | sed "s/[\"\<\>' \t\(\);]/\n/g" | grep "http://" | sort -u | xargs -n 1 -P 10 wget -q

答案3

你不需要需要 xargs,您可以使用简单的 bash 循环来完成此操作,或者将您的 URL 保留为简单列表并将选项直接添加到wget

while IFS= read -r url; do wget --post-data '1=1' "$url"; done < urls.txt

或者将它们包含在文件中并传递给wget

while IFS= read -r url; do wget "$url"; done < urls.txt

相关内容