使用包含点的变量在文件中搜索(使用grep)

时间:2018-05-14 14:22:05

标签: bash awk

A文件 myFile.txt 包含3列:

amy. A B
amy5 B A
amy.smit F P
smit_rees C D

必须编写从第二列获取值的bash脚本,其中第一列包含变量 var 的值。

问题在于何时执行

var='amy.'
grep "$var" myFile.txt | awk '{ print $2 }'

结果是:

A
B
F

但实际结果必须只包含 A 。第一列就像用户名,可以包含点。 如何在变量中转义特殊符号或以某种方式告诉 grep 不要将它们视为特殊符号。

我读了-F标志,但后来grep匹配 amy.smit amy.smit 行。

4 个答案:

答案 0 :(得分:3)

从grep手册页:

  

-w, - word-regexp

     

仅选择包含构成整个单词的匹配项的行。

$ grep -Fw "$var" myFile.txt | awk '{ print $2 }'
A

另外,即使我们在运行grep之前关闭了globbing set -f,我们仍然需要为grep明确指定-F开关,以便不将字符串视为正则表达式。

答案 1 :(得分:2)

您似乎想要进行直接字符串比较,而不是正则表达式匹配。

使用awk

awk -v string="$var" '$1 == string { print $2 }' myFile.txt

对于给定的数据和var='amy.',这只会返回A

答案 2 :(得分:1)

如果您的用例仅涉及.字符,我只需转换模式即可删除.的特殊含义:

var='amy.'; var=`echo $var | sed 's/\./\\\./g'`; grep "$var " inputfile

这导致$ var为amy\.

每个@ninosanta的回答

grep $ var之后的空格,"$var ",这也是一个好主意。

如果可能涉及其他正则表达式元字符,则需要更通用的解决方案,但如果您只需处理.,则此操作是一种实用的,有效的解决方案。

答案 3 :(得分:0)

试试这个:

grep -F "^$var " myFile.txt | awk '{ print $2 }'

你知道在第一个字段之后至少有一个空格。 所以,我认为这是合法的传递"^$var "(带空格)到grep。

它对我有用。