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 行。
答案 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\.
grep
$ var之后的空格,"$var "
,这也是一个好主意。
如果可能涉及其他正则表达式元字符,则需要更通用的解决方案,但如果您只需处理.
,则此操作是一种实用的,有效的解决方案。
答案 3 :(得分:0)
试试这个:
grep -F "^$var " myFile.txt | awk '{ print $2 }'
你知道在第一个字段之后至少有一个空格。
所以,我认为这是合法的传递"^$var "
(带空格)到grep。
它对我有用。