2018年1月8日星期一

parallel命令详解

一、概述
parallel命令是从标准输入并行构建和执行shell命令行
二、命令格式
SYNOPSIS
parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [command [arguments]] ( ::: arguments | :::+ arguments | :::: argfile(s) | ::::+ argfile(s)
) ...
parallel --semaphore [options] command
#!/usr/bin/parallel --shebang [options] [command [arguments]]


三、详解
1.输入源
parallel的输入源可以有文件,命令行,标准输入或管道,可以单输入源和多输入源
例如:parallel echo ::: A B C        #单输入源
parallel echo ::: A B C ::: D E F    #多输入源
parallel -a abc-file echo   或  cat abc-file | parallel echo   #从文件中读取输入源
parallel -a abc-file -a def-file echo   #多文件输入源
cat abc-file | parallel -a - -a def-file echo     #使用 - 标准输入成为输入源
cat abc-file | parallel echo :::: - def-file     #可以使用::::  - 代替 -a file
parallel echo ::: A B C :::: def-file    #::: 和 :::: 可以混用。这里可以看到:::(3个)后面接命令行,::::(4个)后面接文件
2.可以改变分隔符 当:::和::::被用在命令时,很有用
例如:
parallel --arg-sep ,, echo ,, A B C :::: def-file  --arg-sep ,, 就是声明,,替换:::
parallel --arg-file-sep // echo ::: A B C // def-file
3.改变界定符。默认是\n换行符作为一整行的界定符,但是可以用-d参数改变
例如:
#cat abc_-file
A_B_C_
#parallel -d _ echo :::: abc_-file
A
B
C
如果使用空作为界定符,即每个字符都分隔,可以使用\0或者直接 -0
# cat abc0-file
ABC
#parallel -d '\0' echo :::: abc0-file
Output: Same as above.
4.文件终止符,可以设定终止符,当遇到这个符号时停止读入
parallel -E stop echo ::: A B stop C D
Output:
A
B
stop只是一个符号,可以换成其他的都可以
5.忽略空行,使用--no-run-if-empty
(echo 1; echo; echo 2) | parallel --no-run-if-empty echo
output:
1
2
6.如果parallel没有命令,那么参数将被作为命令处理
parallel ::: ls 'echo foo' pwd
Output (the order may be different):
[list of files in current dir]
foo
[/path/to/current/working/dir]
7.命令可以是脚本,二进制文件,和使用export -f宣告的bash函数
# Only works in Bash
my_func() {
echo in my_func $1
}
export -f my_func
parallel my_func ::: 1 2 3
Output (the order may be different):
in my_func 1
in my_func 2
in my_func 3
8.替换字符串,默认是加了{},可使用-I参数替换
parallel echo ::: A/B.C
Output:
A/B.C
parallel echo {} ::: A/B.C
Output:
A/B.C
parallel -I ,, echo ,, ::: A/B.C
{.}移除后面的字符或后缀,可使用--extensionreplace替换
parallel echo {.} ::: A/B.C
Output:
A/B
parallel --extensionreplace ,, echo ,, ::: A/B.C
{/} 移除路径,使用--basenamereplace替换
parallel echo {/} ::: A/B.C
Output:
B.C
parallel --basenamereplace ,, echo ,, ::: A/B.C
{//} 保留路径,--dirnamereplace替换
parallel echo {//} ::: A/B.C
Output:
A
parallel --dirnamereplace ,, echo ,, ::: A/B.C
{/.} 移除路径和后面的后缀,--basenameextensionreplace替换
parallel echo {/.} ::: A/B.C
Output:
B
parallel --basenameextensionreplace ,, echo ,, ::: A/B.C
{#}给出job数,--seqreplace替换
parallel echo {#} ::: A B C
Output (the order may be different):
1
2
3
parallel --seqreplace ,, echo ,, ::: A B C
9.位置代替参数
当多重输入时可以使用{number}
parallel echo {1} and {2} ::: A B ::: C D
Output (the order may be different):
A and C
A and D
B and C
B and D
占位符可以被修改,使用/, //, /., and  .:
parallel echo /={1/} //={1//} /.={1/.} .={1.} ::: A/B.C D/E.F
Output (the order may be different):
/=B.C //=A /.=B .=A/B
/=E.F //=D /.=E .=D/E
可以反向取
parallel echo 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: A B ::: C D ::: E F
Output (the order may be different):
1=A 2=C 3=E -1=E -2=C -3=A
1=A 2=C 3=F -1=F -2=C -3=A
1=A 2=D 3=E -1=E -2=D -3=A
1=A 2=D 3=F -1=F -2=D -3=A
1=B 2=C 3=E -1=E -2=C -3=B
1=B 2=C 3=F -1=F -2=C -3=B
1=B 2=D 3=E -1=E -2=D -3=B
1=B 2=D 3=F -1=F -2=D -3=B
10头定义替换符
使用--header参数使用输入的第一个值作为替换符的名字,这个只有在{}是默认的时候有效
parallel --header : echo f1={f1} f2={f2} ::: f1 A B ::: f2 C D
Output (the order may be different):
f1=A f2=C
f1=A f2=D
f1=B f2=C
f1=B f2=D
文件时tab分割是可以使用--colsep
# cat tsv-file.tsv
f1 f2
A B
C D
# parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv
f1=A f2=B
f1=C f2=D
批量执行脚本
cat aa
node1#ls -l
node2#ls -l
cat exec_one_node.sh
#!/bin/bash
IFS='#' read -r -a array <<< $1
echo $array
ssh -o 'StrictHostKeyChecking no' -o 'UserKnownHostsFile /dev/null' -o ConnectTimeout=2 -o ConnectionAttempts=1  ${array[0]} ${array[1]
cat aa | parallel -j 10 ./exec_one_node.sh {1}
作者:KellanFan 链接:https://www.jianshu.com/p/8273fda73e3a 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
地点: 中国江苏省苏州市