从输入文件中 grep 的两种方法之间的区别

从输入文件中 grep 的两种方法之间的区别

我有一个输入文件,我们将其称为 scan.data。它包含我要 grep 的单词列表。我发现了两种不同的方法来做到这一点,但我得到了截然不同的结果:

IFS=$' '    
find / -type f -exec grep -a -D skip -wo $(<scan.data) '{}' \;

这使我获得了 3,799 场比赛。

find / -type f -exec grep -a -D skip -of scan.data '{}' \;

这使我获得了 18,167 场比赛。

据我了解,设置 IFS 允许我将子 shell 的内容输出为列表,本质上反映了第二种情况的作用。那么究竟是什么原因导致两人的比赛结果出现如此大的差异呢?

答案1

假设您的命令替换被引用(如果没有,则中的大多数单词scan.data将被视为要运行的文件名grep)并且文件中的第一个单词不以破折号开头(如果是,则可能是解释为选项),grep除了使用的选项之外,这两个调用基本上是等效的。如果scan.data包含大量数据, 第一个变体可能还会引发“参数列表太长”错误。

  1. 第一个grep使用-w.这将使用从正则表达式中读取的模式scan.data并尝试匹配完整的单词find在提供给实用程序 的文件中的每一行上(the不是匹配在 ) 的开头theodore
  2. 第二个grep不使用-w。这将使用从正则表达式中读取的模式scan.data并尝试匹配子串find在提供给实用程序的文件中的每一行上(the将在 的开头匹配theodore)。

这可以解释您获得的匹配数量的差异。

如果您不希望实用程序将文件中的模式用作正-F则表达式而是字符串(如果您的模式文件包含正则表达式中的特殊字符,但您需要按字面意思进行匹配,例如, ,等)。grepscan.data.[*

如果文件中有模式,请考虑使用-f来读取它们。使用命令替换是可能的,但仅限于有限的情况(第一个字符串中没有初始破折号,并且只有适量的字符串,如本答案顶部所述)。该选项的存在-f使得完全没有必要使用命令替换。

相关内容