iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >GNU Parallel的具体使用
  • 222
分享到

GNU Parallel的具体使用

GNUParallel 2022-06-04 22:06:54 222人浏览 泡泡鱼
摘要

它是什么? GNU Parallel是一个shell工具,为了在一台或多台计算机上并行的执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入的脚本程序。通常的输入是文件列表、主机列表、用户列表、U

它是什么?

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

生成文件:


SERVER1=server.example.com
SERVER2=server2.example.net

最后应该成功运行如下命令:


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

改变参数分隔符

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

输出:

A/B.C

指定 {} :


parallel echo {} ::: A/B.C

输出同上

去掉扩展名 {.}:


parallel echo {.} ::: A/B.C

输出

A/B

去掉路径 {/}:


parallel echo {/} ::: A/BeNiZxyXCm.C

输出:

B.C

只保留路径 {//}:


parallel echo {//} ::: A/B.C

输出:

A

去掉路径和扩展名 {/.}:


parallel echo {/.} ::: A/B.C

出:

B

输出任务编号:


parallel echo {#} ::: A/B.C

输出:

1
2
3

改变替换字符串

使用 -I 改变替换字符串符号 {}:


parallel -I ,, echo ,, ::: A/B.C

输出:

A/B.C

–extensionreplace替换 {.}:


parallel --extensionreplace ,, echo ,, ::: A/B.C

输出:

A/B

–basenamereplace替换 {/}:


parallel --basenamereplace ,, echo ,, ::: A/B.C

输出:

B.C

–dirnamereplace替换 {//}:


parallel --dirnamereplace ,, echo ,, ::: A/B.C

输出:

A

–basenameextensionreplace替换 {/.}:


parallel --basenameextensionreplace ,, echo ,, ::: A/B.C

输出:

B

–seqreplace替换 {#}:


parallel --seqreplace ,, echo ,, ::: A B C

输出:

1
2
3

指定位置替换字符串

如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:


parallel echo {1} and {2} ::: A B ::: C D

输出:

A and C
A and D
B and C
B and D

可以使用 / // /. 和 .: 改变指定替换字符串:


parallel echo /={1/} //={1//} /.={1/.} .={1.} ::: A/B.C D/E.F

输出:

/=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

输出:

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

按列输入

使用 –colsep 把文件中的行切分为列,做为输入参数。下面使用TAB(\t):

1=f1 2=f2
1=A 2=B
1=C 2=D

指定参数名

使用 –header 把每一行输入中的第一个值做为参数名:


parallel --header : echo f1={f1} f2={f2} ::: f1 A B ::: f2 C D

输出:

f1=A f2=C
f1=A f2=D
f1=B f2=C
f1=B f2=D

使用 –colsep 处理使用TAB做为分隔符的文件:


parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv

输出:

f1=A f2=B
f1=C f2=D

多参数

–xargs 让GNU Parallel支持一行多个参数(可以指定上限):


cat num30000 | parallel --xargs echo | wc -l

输出:

2

30000个参数被分为两行。

一行中的参数个数的上限通过 -s 指定。下面指定最大长度是10000,会被分为17行:


cat num30000 | parallel --xargs -s 10000 echo | wc -l

为了获得更好的并发性,GNU Parallel会在文件读取结束后再分发参数。

GNU Parallel 在读取完最后一个参数之后,才开始第二个任务,此时会把所有的参数平均分配到4个任务(如果指定了4个任务)。

第一个任务与上面使用 –xargs 的例子一样,但是第二个任务会被平均的分成4个任务,最终一共5个任务。


cat num30000 | parallel --jobs 4 -m echo | wc -l

输出:

5

10分参数分配到4个任务可以看得更清晰:


parallel --jobs 4 -m echo ::: {1..10}

输出:

1 2 3
4 5 6
7 8 9
10

替换字符串可以是单词的一部分。通过下面两个命令体会 -m 和 -X 的区别:


parallel --jobs 4 -m echo pre-{}-post ::: A eNiZxyXCmB C D E F G

输出:

pre-A B-post
pre-C D-post
pre-E F-post
pre-G-post

-X与 -m 相反:


parallel --jobs 4 -X echo pre-{}-post ::: A B C D E F G


输出:

pre-A-post pre-B-post
pre-C-post pre-D-post
pre-E-post pre-F-post
pre-G-post

使用 -N 限制每行参数的个数:


parallel -N3 echo ::: A B C D E F G H

输出:

A B C
D E F
G H

-N也可以用于指定位置替换字符串:


parallel -N3 echo 1={1} 2={2} 3={3} ::: A B C D E F G H

输出:

1=A 2=B 3=C
1=D 2=E 3=F
1=G 2=H 3=

-N0 只读取一个参数,但不附加:


parallel -N0 echo foo ::: 1 2 3

输出:

foo
foo
foo

引用

如果命令行中包含特殊字符,就需要使用引号保护起来。

perl脚本 'print “@ARGV\n”' 与linux的 echo 的功能一样。


perl -e 'print "@ARGV\n"' A

输出:

A

使用GNU Parallel运行这条命令的时候,perl命令需要用引号包起来:


parallel perl -e 'print "@ARGV\n"' ::: This wont work

输出:

[Nothing]

使用 -q 保护perl命令:


parallel -q perl -e 'print "@ARGV\n"' ::: This works

输出:

This
works

也可以使用 ' :


parallel perl -e \''print "@ARGV\n"'\' ::: This works, too

输出:

This
works,
too

使用 -quote:


parallel --shellquote
parallel: Warning: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
perl -e 'print "@ARGV\n"'
[CTRL-D]

输出:

perl\ -e\ \'print\ \"@ARGV\\n\"\'

也可以使用命令:


parallel perl\ -e\ \'print\ \"@ARGV\\n\"\' ::: This also works

输出:

This
also
works

去除空格

使用 –trim 去除参数两头的空格:


parallel --trim r echo pre-{}-post ::: ' A '

输出:

pre- A-post

删除左边的空格:


parallel --trim l echo pre-{}-post ::: ' A '

输出:

pre-A -post

删除两边的空格:


parallel --trim lr echo pre-{}-post ::: ' A '

输出:

pre-A-post

控制输出

以参数做为输出前缀:


parallel --tag echo foo-{} ::: A B C

输出:

A       foo-A
B       foo-B
C       foo-C

修改输出前缀 –tagstring:


parallel --tagstring {}-bar echo foo-{} ::: A B C

输出:

 A-bar       foo-A

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

--结束END--

本文标题: GNU Parallel的具体使用

本文链接: https://www.lsjlt.com/news/20107.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux并行作业执行工具GNU Parallel怎么用
    本篇内容介绍了“Linux并行作业执行工具GNU Parallel怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!GNU Paralle...
    99+
    2023-06-27
  • 怎么使用GNU Parallel提高Linux命令行执行效率
    这篇文章主要为大家展示了“怎么使用GNU Parallel提高Linux命令行执行效率”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用GNU Parallel提高Linux命令行执行效率”...
    99+
    2023-06-16
  • Quartz.NET的具体使用
    目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是Quart...
    99+
    2024-04-02
  • JavaScheduledExecutorService的具体使用
    目录1. 延迟不循环任务schedule方法2. 延迟且循环cheduleAtFixedRate方法3. 严格按照一定时间间隔执行``ScheduledExecutorService...
    99+
    2023-05-19
    ScheduledExecutorService
  • QtQFrame的具体使用
    目录1.概述2.常用数据接口3.示例1.概述 void setFrameShape(Shape) QFrame继承QWidget,QFrame类是具有框架的小部件的基类,例如QLab...
    99+
    2024-04-02
  • python__add__()的具体使用
    __add__(),  同一个类,两个对象相加的实现逻辑,重写 + class Myclass(object): def __init__(self,value):...
    99+
    2023-02-27
    python __add__()使用 python __add__
  • pythonhttpx的具体使用
    目录什么是 Httpx安装 Httpx发送 HTTP 请求发送异步 HTTP 请求设置请求标头设置请求参数发送请求体发送 JSON 数据设置超时错误处理证书验证使用代理上传文件使用 ...
    99+
    2023-05-14
    python httpx
  • np.unique()的具体使用
    目录一、np.unique() 介绍二、np.unique() 原型三、实例参考链接一、np.unique() 介绍 对于一维数组或者列表,np.unique() 函数 去除其中重复...
    99+
    2023-03-14
    np.unique()使用 np.unique()
  • python-httpx的具体使用
    目录安装创建请求自定义头部超时时间SSL证书认证请求类型Query ParamsForm表单文件上传JSON二进制数据响应响应类型Cookie重定向历史httpx.Client合并/...
    99+
    2024-04-02
  • Vuex localStorage的具体使用
    目录状态管理的必要性localStorage储存和获取数据生命周期VuexVuex的概念Vuex的工作流程Vuex和localStorage的区别总结前端开发中,状态管理是一个很重要...
    99+
    2023-05-20
    Vuex localStorage
  • numpy.reshape(-1,1)的具体使用
    数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。 举个例子: x = np.array([[2, 0]...
    99+
    2024-04-02
  • Linux下自动化工具Parallel SSH的使用方法
    这篇文章将为大家详细讲解有关Linux下自动化工具Parallel SSH的使用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。parallel-ssh 是为小规模自动化而设计的异步并行的...
    99+
    2023-06-15
  • GO的range具体使用
    目录GO 语言的 for…range  能做什么呢?for…range  如何使用 ?数组 array切片 slicechannel 通道for…rang...
    99+
    2024-04-02
  • JavaScript WeakMap的具体使用
    目录前言一、为何选用WeakMap1. Map2. WeakMap二、WeakMap原型方法总结前言 我在处理一个复杂对象的深拷贝方法时接触到WeakMap, 其作为缓存结构以解决对...
    99+
    2023-02-17
    JavaScript WeakMap
  • C# Volatile的具体使用
    目录​1.Overview2.Detail3.Conclusion4.Reference​1.Overview 经常研究.NET源码库的小伙伴会经常看到一个关...
    99+
    2024-04-02
  • podman容器工具的具体使用
    目录podman简介Podman和Docker的主要区别是什么?podman安装使用配置镜像加速相关工具podman简介 Podman是一个开源项目,可在大多数Linux平台上使用并...
    99+
    2024-04-02
  • numpy.insert()的具体使用方法
    目录1. 参数说明2. 示例2.1. 插入一列,值为标量2.2. 插入一列,值为一维矩阵2.3. 插入多列,值为标量2.4. 输入为一维向量2.5. 输入为矩阵numpy.inser...
    99+
    2023-02-09
    numpy.insert()使用
  • Pytest断言的具体使用
    目录assert断言方法异常断言Excepiton检查断言装饰器Pytest使用的断言是使用python内置的断言assert。Python assert(断言)用于判断一个表达式,...
    99+
    2023-02-07
    Pytest断言
  • React中useRef的具体使用
    相信有过React使用经验的人对ref都会熟悉,它可以用来获取组件实例对象或者是DOM对象。 而useRef这个hooks函数,除了传统的用法之外,它还可以“跨渲染周期”保存数据。 ...
    99+
    2024-04-02
  • nginx之queue的具体使用
    目录一、简介二、数据结构三、相关API3.1 初始化一个队列3.2 判断队列是否为空3.3 队头插入节点3.4 队尾插入节点3.5 从队列中移除某个节点3.6 将队列从某个节点拆分成...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作