【发布时间】:2019-11-06 23:52:40
【问题描述】:
对于文件的每一行,我需要搜索是否在另一个文件中找到了包含正则表达式的字符串。
问题是文件很大,第一个是 24MB,第二个是 115MB。我首先尝试将 $(cat file1) 作为 grep 的第一个参数,但它抱怨文件大小,然后我现在尝试使用 xargs grep 但同样的错误
如果我做一个简单的字符串搜索工作
find . -name records.txt | xargs grep "999987^00086"
999987^00086^14743^00061^4
但是如果尝试使用 cat 作为参数的所有文件失败
find . -name records.txt | xargs grep "$(records_tofix.txt)"
-bash: /usr/bin/xargs Argument list too long on grep
【问题讨论】:
-
我希望您的代码改为打印
bash: records_tofix.txt: command not found -
如果您可以对文件进行排序并为集合比较执行单个合并操作,您将有一个非常、很多更有效的时间——更少的内存使用和那样的时间(在排序完成后,授予,但排序只需要对每个文件进行一次)。请参阅
comm作为标准 UNIX 工具,用于对已排序的输入流进行设置算术(联合、连接和差异)。 -
另外,请注意
xargs只能与-0或-d $'\n'参数一起使用(后者是 GNUism,但如果您希望每条记录一行的文件被明确且正确地解析)。 -
...没有这些参数之一,一行上的
foo bar将被视为两个单独的记录,foo和bar;反斜杠、引号等。还可以得到特殊的(类似外壳但不完全兼容外壳)处理。 -
无论如何,
find . -name records.txt -exec grep -f records_tofix.txt -- {} +是你的朋友;完全没有理由使用xargs。
标签: bash shell scripting grep xargs