linux命令——parallel


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 尤其方便。但是目前我还没想到在这种情况下如何在命令行中使用管道。


文章作者: 梁绍波
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梁绍波 !
评论
  目录