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

gg58donl  于 2023-05-18  发布在  Shell
关注(0)|答案(1)|浏览(162)

我正尝试用curl并行运行url,这些url在一个文本文件中定义。每个URL都在单独的行上。我需要对curl的每个输出调用以下grep命令(grep -Ev 'Server:\|Date:\|Content'),然后将每个输出保存到单独的文件中,并将当前正在运行的作业编号命名。
我使用GNU parallel:

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

输入:

mytxt.txt:

  • URL1
  • URL2
  • URL3
  • URL4
  • URL5
    output:-每个文本文件都将包含curl的输出和grep-ed信息
1.txt

2.txt

3.txt

4.txt

5.txt

问题:

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

iszxjhcz1#

我很高兴你给予--results一个尝试。--results是为更高级的情况而构建的,在这种情况下,您希望同时保持标准输出(STDOUT)和标准错误(STDERR)。在你的例子中,你可以简单地使用普通重定向'>'。
如果命令模板是合成命令,我更喜欢使用bash函数。对我来说,这使引用更容易。它有两个额外的好处:

  • 我可以很容易地在一个单一的值上测试这个函数,然后再把它交给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 =默认值,因此不需要)

相关问题