parallel 的参数介绍见链接博客:Linux下的并行神器——parallel
以下记录好用的几个参数使用:
运行控制
–ungroup
- 一般 GNU parallel 会延迟输出,直到一组命令执行完成。
- 使用
--ungroup
,可立即打印输出已完成部分–linebuffer
- 一个任务的行输出可能会被另一个任务的输出截断。
- 使用
--linebuffer
避免这个问题(稍慢一点)–keep-order/-k
- 使输出与输入顺序保持一致
–dry-run
- 试运行 parallel 指导的命令,并输出要运行的命令行
–delay
- 当job有大量的IO操作时,为避免“惊群效应”,可使用
--delay
参数指定各个job开始的时间间隔。
–joblog file
- 生成各个任务的日志文件
–resume-failed/–retry-failed
- 重新运行失败的任务,二者作用类似,只是
--resume-failed
从命令行读取失败任务,而--retry-failed
则是从日志文件中读取失败任务:
–trim
- 去除参数两头的空格
输入指定
-n number
-n 1
表示每次只取一个输入做参数
–xapply
不使用该参数时,会将多个参数源进行全部组合
$ parallel echo {1} {2} ::: A B ::: C D
A C
A D
B C
B D
加上 –xapply
$ parallel --xapply echo {1} {2} ::: A B ::: C D
A C
B D
按列输入和指定参数名
–header
每一个输入源中的第一个值做为参数名
$ parallel --xapply --header : echo f1={f1} f2={f2} ::: f1 A B ::: f2 C D
f1=A f2=C
f1=B f2=D
–colsep delimiter
把文件中的行切分为列,做为输入参数
$ perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-file.tsv
$ parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv
f1=A f2=B
f1=C f2=D
–joblog 与 –resume
可以记录每个任务的状态。在执行任务时,添加 –joblog 选项,并指定一个日志文件。该日志文件将记录所有任务的执行情况,包括成功或失败的状态。
parallel --joblog joblog.txt <commands>
当你需要中断并稍后继续任务时,可以使用 –resume 选项,它会基于 –joblog 文件中的信息,只重新运行失败的或未完成的任务。
parallel --resume --joblog joblog.txt <commands>
parallel 与 xargs 管道连用
$ find ./ -name '*.txt' | parallel xargs -n 1 grep 'target'
parallel 与 awk 连用
这有一个实用帖子GNU Parallel + AWK: 让你的文本处理飞起来
parallel 后所有特殊字符都会不会被自动转译,所以要自行添加 \
手动转译,包括 space,comma,semicolons
–linebuffer 保证并行结果不串行
-q 支持引号。 保证命令行中的特殊字符不被翻译,这样做对 awk 尤其方便。但是目前我还没想到在这种情况下如何在命令行中使用管道。