Shell:匹配保存在变量中的确切字符串

时间:2015-03-25 22:05:07

标签: bash shell awk grep

我有这个文件:

$ cat file.txt
/home/user/abc   test1   15-03-25
/home/user/abc   test2   15-03-25
/home/user   test3   15-03-25
/home/user   test4   15-03-25

我需要匹配变量($pathtosearch = /home/user)中指定的确切路径的行。 我尝试了基本的awk命令:

$ awk "$pathtosearch" file.txt
/home/user/abc   test1   15-03-25
/home/user/abc   test2   15-03-25
/home/user   test3   15-03-25
/home/user   test4   15-03-25

但它与精确的字符串不匹配。

我需要输出看起来像这样:

$ command?? file.txt
/home/user   test3   15-03-25
/home/user   test4   15-03-25

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

不要将变量直接替换为awk代码;它将被视为代码而不是数据,并且您将遇到元字符问题(并打开代码注入漏洞)。而是使用-v使awk代码知道变量,并使用适当的测试来选择行:

awk -v path="$pathtosearch" '$1 == path' file.txt

如果数据是以制表符分隔的(我可能是预感),请明确指定字段分隔符:

awk -F '\t' -v path="$pathtosearch" '$1 == path' file.txt

这将避免搜索路径中出现空格问题。