【问题标题】:grep -Ff producing invalid outputgrep -Ff 产生无效输出
【发布时间】:2018-06-16 08:50:05
【问题描述】:

我正在使用

代码-

 grep -Ff list.txt C:/data/*.txt > found.txt

但它一直输出无效响应,行不包含我输入的电子邮件..

list.txt 包含 -

email@email.com
customer@email.com
imadmin@gmail.com
newcustomer@email.com
helloworld@yes.com

等等.. 每行匹配的电子邮件,

搜索文件包含 -

user1:phonenumber1:email@email.com:last-active:recent
user2:phonennumber2:customer@email.com:last-active:inactive
user3:phonenumber3:blablarandom@bla.com:last-active:never

那么另一个可能包含 -

blublublu         email@email.com         phonenumber         subscribed
nanananana        customer@email.com      phonenumber         unsubscribed
useruser          noemailinput@noemail.com       phonenumber      pending

所以我要做的是向 grep 提供电子邮件列表/字符串列表“list.txt”,然后搜索提供的目录以查找每个字符串的匹配项,并输出包含每个匹配项的整行。

这种情况下的输出示例是 -

user1:phonenumber1:email@email.com:last-active:recent
user2:phonennumber2:customer@email.com:last-active:inactive
blublublu         email@email.com         phonenumber         subscribed
nanananana        customer@email.com      phonenumber         unsubscribed

但它不会输出其他两行 -

 user3:phonenumber3:blablarandom@bla.com:last-active:never
 useruser          noemailinput@noemail.com       phonenumber      pending

因为该行内没有字符串。

【问题讨论】:

  • 我将内容复制到文件并运行命令。它没有输出 user3 和 noemailinput。
  • @Cyrus 解决方案不起作用,它似乎对我不起作用:S
  • @choroba 尝试使用特殊字符“-、_、.”或类似字符的电子邮件,也许这就是导致我的问题的原因?
  • 我建议 dos2unix s.txt 删除 DOS 换行符。

标签: bash awk grep gawk gnuwin32


【解决方案1】:

我认为您的文件list.txt 中可能有空行,导致它匹配C:/data/*.txt 指定的文件中的每一行。要解决此问题,您可以手动删除每个空行或运行命令sed -i '/^$/d' list.txt,其中-i 标志在原地编辑文件。

问题也可能与dos回车有关,尝试运行:cat -v list.txt并检查行后是否有^M

email@email.com^M
customer@email.com^M

如果是这种情况,您需要使用dos2unixtr -d '\r' < list.txt > output.txt 修改文件。

【讨论】:

  • 它仍在产生不匹配的行,是否有可能是正在搜索的文件导致问题?或潜在的特殊字符?比如“.”、“-”、“_”等
  • 我不认为 grep 与他们有问题,如果我有空行,我似乎只能重新创建您的问题。也许您可以尝试使用grep -wFf
  • 我刚刚尝试了上面的示例并且工作正常,但是对于我想要与之匹配的实际内容会产生错误的线条.. :S 这可能是由我正在搜索的内容引起的吗?
  • 添加了关于特殊字符的附加评论,希望它能解决您的问题。
  • @jakereading 我们应该如何帮助您调试您提供的示例输入不存在的问题?当发布示例输入/输出以提供确实重现您的问题的数据而不是重现问题的数据时,这难道没有意义吗? “我的车无法启动,请你看看这辆自行车,告诉我怎么回事”。
【解决方案2】:

文件list.txt 可能包含空行或某些分隔符。当我将: 添加到list.txt 时,第一个示例中的所有行都开始匹配。同样,添加一个空格使第二个示例中的所有行都匹配。添加@ 会导致相同的症状。

尝试运行 grep -oFf ...(如果您的 grep 支持 -o)以查看完全匹配的部分。如果 list.txt 中有空行,则匹配数将小于没有-o 的匹配数。尝试在-o 的输出中搜索极短的输出以检查可疑字符串。您还可以检查 list.txt 中最短的行。

while read line ; do echo ${#line} "$line" ; done < list.txt | sort -nk1,1

【讨论】:

  • 奇怪的是,如果我使用 -o 它只输出匹配项而不是整行,只输出从我的列表中找到的电子邮件
  • 是的,-o 就是这样做的。
  • 那么为什么当我删除 -o 它输出错误匹配:s
  • 对我来说,只有在列表中有空行时才会发生这种情况。
猜你喜欢
  • 2016-09-29
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2017-07-25
相关资源
最近更新 更多