搜索电子邮件地址的文件行 - 返回整行,使用bash

时间:2015-02-19 00:20:34

标签: bash

假设我有一个文件(sizes.txt)

daveclark@foo.com 0 23252 0
mikeclark@foo.com 0 45131 1
clark@foo.com 0 55235 0
joeclark@bar.net 33632 1
maryclark@bar.net 0 55523 0
clark@bar.net 0 99356 0

现在我有另一个文件(users.txt)

clark@foo.com
clark@bar.net

我想要做的是在sizes.txt中找到sizes.txt中的每一行,在CentOS中使用循环,bash或one-liner。这是关键点,我需要找到仅包含clark@foo.com和clark@bar.net的行 - 这意味着每行只应该有一行。

想到最简单的方法......

for i in `cat users.txt`; do grep $i sizes.txt; done

...但这不起作用,因为处理第一行users.txt将返回包含daveclark @ foo.com,mikeclark @ foo.com和clark@foo.com的行。我明确地希望包含" clark@foo.com" (sizes.txt的第三行)。处理第二行users.txt会遇到同样的问题(它将返回maryclark@bar.net和clark@bar.net行)我知道这必须是一个非常简单的东西,我忽略了。

2 个答案:

答案 0 :(得分:1)

您正在寻找的是与grep的完全匹配。在你的情况下,这将是-w选项。

所以

  

for cat users.txt中的我        grep -w“^ $ i”sizes.txt
  完成

应该这样做。

干杯。

答案 1 :(得分:0)

你可以只使用bash内置函数和语法来尝试这样的事情:

while read -r user ; do
  while read -r s_user s_column_2 s_column_3 s_column_4  ; do
    [ "${s_user}" = "${user}" ] && printf "%b\t%b\t%b\t%b\n" "${s_user}" "${s_column_2}" "${s_column_3}" "${s_column_4}"
  done < sizes.txt
done < users.txt

使用big size.txt文件时,这个嵌套的while可能会很慢。在这些情况下,您可以将其与awk

结合使用