linuxparallel指令参数,GNUParallel的具体使⽤
它是什么?
GNU Parallel是⼀个shell⼯具,为了在⼀台或多台计算机上并⾏的执⾏计算任务,⼀个计算任务可以是⼀条shell命令或者⼀个以每⼀⾏做为输⼊的脚本程序。通常的输⼊是⽂件列表、主机列表、⽤户列表、URL列表或者表格列表;⼀个计算任务也可以是⼀个从管道读取的⼀条命令。GNU Parallel会把输⼊分块,然后通过管道并⾏的执⾏。
如果你会使⽤xargs和tee命令,你会发现GNU Parallel⾮常易于使⽤,因为GNU Parallel具有与xargs⼀样的选项。GNU Parallel可以替代⼤部分的shell循环,并且⽤并⾏的⽅式更快的完成计算任务。
GNU Parallel保证它的输出与顺序执⾏计算任务时是⼀样的,这样就可以⽅便的把GNU Parallel的输出做为其它程序的输⼊。
对于每⼀⾏输⼊,GNU Parallel会把这⼀⾏做为参数来运⾏指定的命令。如果没有给出命令,那么这⼀⾏会被当做命令执⾏。多⾏输⼊会并⾏的运⾏。GNU Parallel经常被⽤于替代xargs或者cat | bash。
指南
本教程展⽰了绝⼤多数GNU Parallel的功能。旨在介绍GNU Parallel中的⼀个选项,⽽⾮讲解真实世界中使⽤的例⼦。花⼀个⼩时的时间学习本教程,你会由此爱上上命令⾏。
预备
为了执⾏本教程中的⽰例,你⾸先需要做如下准备:
parallel >= version 20130814
安装最新版:
(wget -O - pi.dk/3 || curl pi.dk/3/) | bash
这条命令同时也会安装最新版的指南
man parallel_tutorial
本教程的⼤部分内容同时也兼容旧版本。
abc-file
⽣成⽂件:
parallel -k echo ::: A B C > abc-file
def-file
⽣成⽂件:
parallel -k echo ::: D E F > def-file
abc0-file
⽣成⽂件:
perl -e 'printf "A\0B\0C\0"' > abc0-file
abc_-file
⽣成⽂件:
perl -e 'printf "A_B_C_"' > abc_-file
tsv_file.tsv
⽣成⽂件:
perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-file.tsv
num30000
⽣成⽂件:
perl -e 'for(1..30000){print "$_\n"}' > num30000
num1000000
⽣成⽂件:
perl -e 'for(1..1000000){print "$_\n"}' > num1000000
num_%header
⽣成⽂件:
(echo %head1; echo %head2; perl -e 'for(1..10){print "$_\n"}') > num_%header
远程执⾏:ssh免密码登录$SERVER1和$SERVER2
⽣成⽂件:
ample
ample
最后应该成功运⾏如下命令:
ssh $SERVER1 echo works
ssh $SERVER2 echo works
使⽤ ssh-keygen -t dsa; ssh-copy-id $SERVER1 建⽴环境(使⽤empty pass phrase)输⼊源
GNU Parallel的输⼊源⽀持⽂件、命令⾏和标准输⼊(stdin或pipe)
单个输⼊源
从命令⾏读取输⼊:
parallel echo ::: A B C
输出(由于任务以并⾏的⽅式执⾏,顺序可能会有所不同):
A
B
C
⽂件做为输⼊源:
parallel -a abc-file echo
输出同上。
STDIN(标准输⼊)做为输⼊源:
cat abc-file | parallel echo
输出同上。
多输⼊源
GNU Parallel⽀持通过命令⾏指定多个输⼊源,它会⽣成所有的组合:
parallel echo ::: A B C ::: D E F
输出:
A D
A E
A F
B D
B E
B F
C D
C E
C F
多个⽂件做为输⼊源:
parallel -a abc-file -a def-file echo
输出同上。
STDIN(标准输⼊)可以做为输⼊源中的⼀个,使⽤“-”:cat abc-file | parallel -a - -a def-file echo
输出同上。
可以使⽤“::::”替代 -a:
cat abc-file | parallel echo :::: - def-file
输出同上。
::: 和 :::: 可以混合使⽤:
parallel echo ::: A B C :::: def-file
输出同上。
适配参数
–xapply 从每⼀个输⼊源取⼀个参数:
parallel --xapply echo ::: A B C ::: D E F
输出:
A D
B E
C F
如果其中⼀个输⼊源的长度⽐较短,它的值会被重复:parallel --xapply echo ::: A B C D E ::: F G
输出:
A F
B G
C F
D G
E F
改变参数分隔符
curl是什么命令
GNU Parallel可以指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占⽤的时候会特别有⽤:parallel --arg-sep ,, echo ,, A B C :::: def-file
输出:
A D
A E
A F
B D
B E
B F
C D
C E
C F
改变参数分隔符:
parallel --arg-file-sep // echo ::: A B C // def-file
输出同上。
改变参数定界符
GNU Parallel默认把⼀⾏做为⼀个参数:使⽤ \n 做为参数定界符。可以使⽤ -d 改变:parallel -d _ echo :::: abc_-file
输出:
A
B
C
\0 代表NULL:
parallel -d '\0' echo :::: abc0-file
输出同上。
-0 是 -d '\0' 的简写(通常⽤于从 find … -print0读取输⼊):
parallel -0 echo :::: abc0-file
输出同上。
输⼊源中的结束值
GNU Parallel⽀持指定⼀个值做为结束标志:
parallel -E stop echo ::: A B stop C D
输出:
A
B
跳过空⾏
使⽤ –no-run-if-empty 来跳过空⾏:
(echo 1; echo; echo 2) | parallel --no-run-if-empty echo
输出:
1
2
构建命令⾏
没有指定命令意味着参数就是命令
如果parallel之后没有给定命令,那么这些参数会被当做命令:
parallel ::: ls 'echo foo' pwd
输出:
[当前⽂件列表]
foo
[当前⼯作⽬录的路径]
命令可以是⼀个脚本⽂件,⼀个⼆进制可执⾏⽂件或⼀个bash的函数(须⽤ export -f 导出函数):# Only works in Bash and only if $SHELL=.../bash
my_func() {
echo in my_func $1
}
export -f my_func
parallel my_func ::: 1 2 3
输出:
in my_func 1
in my_func 2
in my_func 3
替换字符串
5种替换字符串
GNU Parallel⽀持多种替换字符串。默认使⽤ {}:
parallel echo ::: A/B.C

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。