#command-line #command-arguments #command #data #shell #json-input #xargs

app each

在命令行上处理结构化数据的一种更好的方式

4 个版本

0.2.0 2022年5月2日
0.1.2 2019年11月16日
0.1.1 2019年11月14日
0.1.0 2019年11月12日

命令行实用程序 中排名第 2747

MIT 许可证

31KB
801 行(不包括注释)

Each:从 CSV、JSON 等构建命令行

Crates.io Continuous integration

你是否发现自己在使用 grepcutxargs 这类棘手且易碎的咒语?Each 旨在提供一种更好的方式,在命令行上处理结构化数据列表。

示例

将 CSV 转换为 JSON

当未提供命令参数时,each 会以 JSON 格式(或使用 -F 参数的另一种受支持格式)美化打印解析项。

people.csv 的内容

name,email
Bart Simpson,bart@example.com
Homer Simpson,homer@example.com

运行 each

each < people.csv > people.json

生成的 people.json

[
	{
		"name": "Bart Simpson",
		"email": "[email protected]"
	},
	{
		"name": "Homer Simpson",
		"email": "[email protected]"
	}
]

在命令参数中使用命名字段

每个命令参数都是一个 Handlebars 模板,其中包含可用在其上下文中的完整行数据。

each echo '{{name}} <{{email}}>' < people.csv

输出

Bart Simpson <bart@example.com>
Homer Simpson <homer@example.com>

查询输入数据

您可以使用任意的 JMESPath 查询从输入数据中提取行。

curl https://cat-fact.herokuapp.com/facts |
	each -q 'all[?upvotes > `4`]' -- \
	echo {{user.name.first}}: {{text}}

向每个命令提供 stdin

您还可以使用 -s / --stdin 参数(或使用 -S / --stdin-file 参数的文件内容)作为模板,发送到每个命令进程的 stdin。

例如,mail 程序从 stdin 读取消息。

each -i people.json \
	--stdin='Dear {{name}}, have a great day!' \
	mail -s 'Exciting message' {{email}}

并行运行命令

类似于 xargs,您可以通过提供 -P / --max-procs 参数来并行运行多个命令。这对于长时间运行但资源消耗低的命令特别有用。

each -i videos.json -P 16 -- youtube-dl {{url}}

为每个命令提示确认

类似于xargs,-p / --interactive 标志将显示结果命令行并提示您确认运行每个命令。这为您提供了一个在启动可能昂贵/危险的操作之前检查命令的机会。请注意,如果使用--stdin--stdin-file参数,则不会显示传递给stdin的插值值,因为它通常很大。要将其包括在提示中,请使用--prompt-stdin

each -p rm {{tmppath}} < datasets.csv

输出

rm '/tmp/tmp.OFW3bJ5psl' [Y/n]

安装

cargo install each

安全考虑

每个都代表您使用潜在不可信的数据执行命令,因此请务必小心使用。

特别要提防向其提供其他用户可写入的文件或从不受信任的来源获取的文件。数据文件可能在您检查它和用每个调用它之间发生变化,或者攻击者可能已精心制作文件以使其看似有效。

虽然它不对第一个命令参数(可执行路径)应用模板替换,但后续参数可能会有意外行为。

例如,如果您的可执行文件是脚本解释器,则提供多个脚本可能是完全有效的,这可能导致不可信代码执行。以下调用以看似安全的方式将两个数据控制的参数传递给Perl脚本

each -i people.json -- \
	perl -e 'print reverse @ARGV' '{{name}}' '{{email}}'

但是,以下恶意用户可以运行任意Perl代码(在本例中调用uptime

{
	"name": "-e",
	"email": "; system uptime"
}

Repography标志 / 最近活动 时间段

Timeline graph Issue status graph

许可证

版权所有 2019-2022 Arpad Ray

在此特此授予任何获得此软件和相关文档副本(“软件”)的人,在不受限制的情况下处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他方式,无论是由于软件或其使用或其它方式而产生的。

依赖项

约10-20MB
约260K SLoC