我正在寻找一种方法来真正处理 bash 文件中无限数量的参数。我遇到的问题是 xargs 在 14881 行后退出。我的文件是1.9gb,包含大约30m行。有没有更好的方法,我应该这样做?
我的代码示例:
cat /home/user/Desktop/file.log | xargs ethereum_private_key_to_address
这工作得很好,但在 35 个不同实例上达到上述行数后退出。
编辑: 为了清楚起见,我需要逐行处理此文件。每行正好是 64 个字符,没有空格 a-f 和 0-9
编辑: 跟蟒蛇一起去,整夜跑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()
并不是说xargs
在阅读了 14881 行后退出。它读取整个输入,并根据其对命令最大大小的保守估计将其划分为它认为最长的可能命令行。(见getconf ARG_MAX
(。
这假定目标命令可以接受任意数量的参数并对所有参数执行操作。许多标准命令行实用程序完全以这种方式工作。并且有一个重要的效率,因为加载和初始化可执行文件是一个很大的开销。在您的例子中,xargs
将日志文件中提供的 3000 万个参数划分为 14,881 次ethereum_private_key_to_address
调用,每次调用大约 2,000 个参数。
问题是ethereum_private_key_to_address
忽略了除第一个参数之外的所有参数。因此,实际上只处理了 14,881 个密钥。这些不是前 14,881 行,而是输入文件上等距的 14,881 行。
最好的解决方案是重写实用程序以了解多个参数。但是,如果无法执行此操作,则可以使用-n1
命令行选项来告诉xargs
在每个命令行上最多放置一个参数。
为什么不通过stdin
传递输入
ethereum_private_key_to_address "$(</home/user/Desktop/file.log)"