我正在尝试使用 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:
输出: - 每个文本文件都将包含带有 grep 信息的 curl 输出
1.txt
2.txt
3.txt
4.txt
5.txt
问题:
--result output/{#}.txt
还生成文件 *.err 和 *.seq,我不需要。我怎么能只生成像 1.txt、2.txt、3.txt... 这样的文件,其中数字是作业编号?grep -Ev 'Server:\|Date:\|Content'
),这将从每个 curl 输出中获取一些信息。谢谢解答
我很高兴你试一试
--results
。 --results
是为更高级的情况而构建的,您希望同时保留标准输出(STDOUT)和标准错误(STDERR)。在你的情况下,你可以简单地使用正常的重定向'>'。
如果命令模板是组合命令,我更喜欢使用 bash 函数。对我来说,它更容易获得正确的报价。它有 2 个额外的好处:
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 = 默认值,所以不需要)
@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 的文件,包含整个输出。
我做错了什么?
谢谢