grep -Ff产生无效输出

时间:2018-01-06 21:51:48

标签: bash awk grep gawk gnuwin32

我正在使用

代码 -

 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

因为该行内没有字符串。

2 个答案:

答案 0 :(得分:0)

我认为您的文件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修改文件。

答案 1 :(得分:0)

文件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