如何用GNU Parallel并行执行curl,生成指定输出文件并过滤结果?
解决GNU Parallel的两个问题:避免多余文件与输出过滤
1. 仅生成任务编号命名的输出文件
--results参数的设计逻辑就是同步生成.err(标准错误输出)和.seq(任务序列信息)文件,要只保留编号命名的输出文件,直接在Parallel执行的命令内部用输出重定向替代--results即可:
- 先确保输出目录存在(避免写入失败):
mkdir -p output
2. 结合grep实现输出过滤
将curl的输出通过管道传给grep做过滤,再把过滤后的结果写入目标文件。需要将整个命令用引号包裹,确保Shell能正确解析管道和重定向逻辑。
完整命令示例
parallel -j+0 --k --eta 'curl -XGET -I -s --max-time 5 {} | grep -Ev "Server:|Date:|Content" > output/{#}.txt' < mytxt.txt
关键参数说明
{}:会被替换为mytxt.txt中的每一行URL{#}:代表当前任务的顺序编号,自动生成1.txt、2.txt这类文件名grep -Ev "Server:|Date:|Content":过滤掉包含Server:、Date:或Content开头的行-j+0:使用与CPU核心数一致的并行任务数,--k保持任务输出顺序与输入URL顺序一致,--eta实时显示任务完成进度
如果需要忽略curl的错误输出(比如连接失败的提示),可以在curl命令后追加2>/dev/null:
parallel -j+0 --k --eta 'curl -XGET -I -s --max-time 5 {} 2>/dev/null | grep -Ev "Server:|Date:|Content" > output/{#}.txt' < mytxt.txt
内容的提问来源于stack exchange,提问作者Morty
相关产品推荐
相关产品推荐

