在bash中真正接受来自文件的无限参数

在bash中真正接受来自文件的无限参数,bash,ubuntu,Bash,Ubuntu,我正在寻找一种在bash中真正处理来自文件的无限数量的参数的方法。我遇到的问题是xargs在14881行之后退出。我的文件是1.9gb,包含大约3000万行。我有没有更好的办法 我的代码示例: cat /home/user/Desktop/file.log | xargs ethereum_private_key_to_address 这非常有效,但是在35个不同的实例上使用了上述数量的行之后就退出了 编辑: 为了清楚起见,我需要逐行处理这个文件。每行正好是64个字符,没有空格a-f和0-9

我正在寻找一种在bash中真正处理来自文件的无限数量的参数的方法。我遇到的问题是xargs在14881行之后退出。我的文件是1.9gb,包含大约3000万行。我有没有更好的办法

我的代码示例:

cat /home/user/Desktop/file.log | xargs ethereum_private_key_to_address
这非常有效,但是在35个不同的实例上使用了上述数量的行之后就退出了

编辑: 为了清楚起见,我需要逐行处理这个文件。每行正好是64个字符,没有空格a-f和0-9

编辑: 用python写的,运行了一整夜的3m+行,我觉得它很稳定

import subprocess
filepath = '/home/linadmin/Desktop/pkeys.log'
with open(filepath) as fp:
   line = fp.readline()
   while line:
       line = fp.readline()

       convertaddress = subprocess.run(["ethereum_private_key_to_address"], stdout=subprocess.PIPE, text=True, input=line)
       f = open("/home/linadmin/Desktop/processed.log", "a")
       f.write(convertaddress.stdout)
       f.close()

为什么不通过
stdin

ethereum_private_key_to_address  "$(</home/user/Desktop/file.log)" 

ethereum_private_key_to_address“$(并不是说
xargs
在读取14881行后退出。它读取整个输入,并根据其对命令最大大小的保守估计将其划分为可能最长的命令行。(请参见
getconf ARG_MAX

这假设目标命令可以接受任意数量的参数,并对所有参数执行操作。许多标准命令行实用程序正是以这种方式工作的。这会产生重要的效率,因为加载和初始化可执行文件是一项巨大的开销。在您的例子中,
xargs
除以30毫秒在日志文件中提供的参数上,调用了14881次以太坊私钥到地址的调用,每次调用大约2000个参数

问题是,
ethereum_private_key_to_address
忽略了除第一个参数以外的所有参数。因此,实际上只处理了14881个键。这些键不是前14881行,而是输入文件上等距分布的14881行


最好的解决方案是重写该实用程序以理解多个参数。但是如果您无法做到这一点,您可以使用
-n1
命令行选项告诉
xargs
在每个命令行上最多放置一个参数。

这会尝试将整个文件作为单个参数传递。文件的内容是什么?请尝试
“$(tr'\n''这也会尝试在一个参数中传递整个文件。如果要在stdin上传递内容,则需要使用
ethereum_private_key_to_address
,但显然这将不起作用,除非写入命令以接受stdin上的数据。OP只想在一行中传递整个文件。而不是ro按行处理。这将是无引号的以太坊私钥地址$(对
xargs
将处理的行数没有限制。相反,您应该确定
xargs
提前退出的原因。例如,该文件是否包含一个错误的引号或超过128k的单行?命令是否在任何点以255退出或被信号终止?@will.ditch:什么是“它退出”?如果它提前停止,您至少会收到一条错误消息。退出后xargs的退出状态是什么?@will.ditch:另外,您可以尝试使用
--verbose
运行
xargs
。因为在您的情况下,输出将非常大,我建议将其重定向到一个文件。请注意,verbose选项将其日志写入stderr!Does
ethereum_private_key_to_address
接受多个参数?@rici否,正确的语法是command,然后是16位64char十六进制字符串。这非常有意义。非常感谢您花时间如此雄辩地解释。