【问题标题】:How to read strings from a text file and use them in grep?如何从文本文件中读取字符串并在 grep 中使用它们?
【发布时间】:2021-06-29 22:09:55
【问题描述】:

我有一个字符串文件,需要在另一个文件中搜索。所以我尝试了以下代码:

#!/bin/bash

while read name; do
   #echo $name
   grep "$name" file.txt > results.txt
done < missing.txt

回显行确认文件正在被读入变量,但我的结果文件始终为空。在自己的作品上执行 grep 命令,我显然在这里遗漏了一些非常基本的东西,但我已经卡了一段时间,无法弄清楚。

我也试过在变量周围不加引号。有人可以告诉我我错过了什么吗?非常感谢

编辑 - 输入文件是 DOS 格式,将文件格式设置为 unix,现在可以正常工作了

【问题讨论】:

  • 还有fgrep 或更近(相同的想法),grep -F -f listile.txt *.txt 将在所有.txt 文件中搜索filelist.txt 中的文本行。阅读man grep 了解详情。如果您不想从文件列表中搜索正则表达式,那就更复杂了。祝你好运。
  • @shellter 哦,这很有希望!当我尝试它只返回文件中最后一行的 grep 结果时(带有搜索字符串的文件)

标签: bash grep


【解决方案1】:

使用grep's -f option:那么你只需要一个grep调用,不需要循环。

grep -f missing.txt file.txt > results.txt

如果“missing.txt”的内容是固定字符串,而不是正则表达式,这样会加快处理速度:

grep -F -f missing.txt file.txt > results.txt

如果你想在其他文件中找到missing.txt的words,而不是partialwords

grep -F -w -f missing.txt file.txt > results.txt

【讨论】:

  • 很高兴知道,感谢您提供的信息!
【解决方案2】:

我的第一个猜测是,您在 while 循环的每次迭代中都覆盖了您的 results.txt 文件(使用单个 &gt;)。如果是这种情况,您至少应该在missing.txt 文件中获得最后一行的结果。然后我认为这样做就足够了

#!/bin/bash
 
while read name; do
   #echo "$name"
   grep "$name" file.txt
done < missing.txt > results.txt

【讨论】:

  • 感谢您的回复!尽管如此,仍然没有运气,并且将输出文件放在该位置似乎也与变量赋值混淆 - 我认为如果我要覆盖它,我至少应该将 grep 的最后结果保存到文件中,但它是完全空白
  • 我会尝试将 while 循环括在大括号中。您是否尝试过手动 grepping 最后一行以查看它是否提供了一些输出?
  • 是的,手动 grepping 是可行的,如果我在循环外硬编码一个变量并用硬编码的变量替换读入的变量,它可以工作,所以我正在阅读的变量之间存在一些脱节并在 grep 中使用它。但是呼应变量是有效的,所以我完全糊涂了
  • 嗯,这是第一次......我试图重现这个问题(在 debian buster 中)但它对我来说很好,没有问题......我希望我能进一步提供帮助,祝你好运!
  • Ahhhhh 我的文件是 DOS 格式的,已转换,现在一切正常。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2021-06-24
  • 2021-05-25
  • 2013-12-18
  • 2021-01-11
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多