使用 GNU parallel 从文件并行运行 curl,并将输出保存到单独的文件中,并使用正在运行的作业编号的名称

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

我正在尝试使用 curl 在并行 url 中运行,这些 url 在一个文本文件中定义。每个网址都在单独的行上。我需要在 curl 的每个输出上调用以下 grep 命令 (

grep -Ev 'Server:\|Date:\|Content'
),然后我想将每个输出保存到单独的文件中,其中包含当前正在运行的作业数的名称。

我正在使用 GNU 并行:

parallel --results  output/{#}.txt  -j+0 --k --eta g curl -XGET -I -s --max-time 5 < mytxt.txt

输入:

mytxt.txt:

  • url1
  • 网址2
  • url3
  • url4
  • 网址5

输出: - 每个文本文件都将包含带有 grep 信息的 curl 输出

1.txt

2.txt

3.txt

4.txt

5.txt

问题:

  1. --result output/{#}.txt
    还生成文件 *.err 和 *.seq,我不需要。我怎么能只生成像 1.txt、2.txt、3.txt... 这样的文件,其中数字是作业编号?
  2. 我不知道如何将 grep 命令与并行命令组合使用 (
    grep -Ev 'Server:\|Date:\|Content'
    ),这将从每个 curl 输出中获取一些信息。

谢谢解答

bash shell curl grep gnu-parallel
2个回答
0
投票

我很高兴你试一试

--results
--results
是为更高级的情况而构建的,您希望同时保留标准输出(STDOUT)和标准错误(STDERR)。在你的情况下,你可以简单地使用正常的重定向'>'。

如果命令模板是组合命令,我更喜欢使用 bash 函数。对我来说,它更容易获得正确的报价。它有 2 个额外的好处:

  • 在将函数提供给 GNU Parallel 之前,我可以轻松地在单个值上测试该函数。
  • 更容易记录功能的每个步骤。
doit() {
  url="$1"
  output="$2"
  curl -XGET -I -s --max-time 5 "$url" |
    # We do not care about Server, Date and Content
    grep -Ev 'Server:\|Date:\|Content' > "$output"
}
export -f doit

parallel --eta doit {} {#}.txt < mytxt.txt 

(-j+0 = 默认值,所以不需要)


0
投票

@Ole Tange

嗨, 谢谢你的回答。

是的,我同意它应该封装到 bash 脚本或 bash 函数中。

我决定使用 bash 脚本。它用 grep 命令解决了我的问题,但是我仍然对 {#} 有疑问。它不会生成名称中包含作业编号的文件。我改用环境变量PARALLEL_SEQ。这行得通。

这是我的 bash 脚本:script.sh:

url=$2
request=${url/"localhost"/"localhost:$1"}
output=$(curl -XGET -I -s --max-time 5 $request)
echo "$output" | grep -Ev "Server:|Date:|Content"

我这样称呼它:

parallel --k --eta > {#}.txt  ./script.sh 50001 < liveinstaller.txt

输出: 一个名为 ${#}.txt 的文件,包含整个输出。

我做错了什么?

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.