【问题标题】:Workaround for xargs Argument list too long in grepgrep 中 xargs 参数列表过长的解决方法
【发布时间】: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 将被视为两个单独的记录,foobar;反斜杠、引号等。还可以得到特殊的(类似外壳但不完全兼容外壳)处理。
  • 无论如何,find . -name records.txt -exec grep -f records_tofix.txt -- {} + 是你的朋友;完全没有理由使用xargs

标签: bash shell scripting grep xargs


【解决方案1】:

使用-f 选项:

grep -f records_tofix.txt

该文件应包含单独一行的模式。

find可以直接执行命令,没有理由调用xargs-exec+ 语法不会为每个值单独调用命令,而是填充整个命令行,类似于 xargs

find . -name records.txt -exec grep -f records_tofix.txt -- {} +

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2010-11-10
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2011-11-23
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多