我使用grep -w进行精确的单词匹配。我的问题是grep -w只考虑字母,数字和下划线作为单词构成字符。但我希望除了空格之外的所有其他字符都是单词构成字符。这是我的文本文件,输出和所需的输出。
文件:file1.txt
clk_file help
co <clk_file> help2
code_error help3
命令:grep -w clk_file file1.txt
输出:
clk_file help
co <clk_file> help2
期望的输出:
clk_file help
任何人都可以告诉我应该用什么来获得所需的输出。 提前致谢
答案 0 :(得分:1)
grep
还不够。
此awk
是一种解决方法:
$ awk '{f=0; for (i=1; i<=NF; i++) { if ($i == "clk_file") f=1} if (f) print}' file
clk_file help
它遍历该行的所有单词并设置标记f=1
,以防确切单词clk_file
与其中一个匹配。然后,如果设置了标志,它将打印该行。
如果您希望模式为变量,请使用-v
:
$ myvar="clk_file"
$ awk -v patt=$myvar '{f=0; for (i=1; i<=NF; i++) { if ($i == patt) f=1} if (f) print}' file
clk_file help
这是因为它与awk变量和bash变量不同。要在awk中使用bash变量,您需要进行-v
分配。
答案 1 :(得分:1)
使用sed
:
sed -n '/\(^clk_file \| clk_file$\| clk_file \)/p' yourfile
使用grep
:
grep '\(^clk_file \| clk_file$\| clk_file \)' yourfile
正如@AvinashRaj评论的那样,如果您的grep
支持-P
选项,那么您无需转义|
,(
和)
。只需写为,
grep -P '(^clk_file | clk_file$| clk_file )' yourfile
<强>测试强>
$ cat file
clk_file help
help clk_file
co <clk_file> help2
code_error help3
help1 clk_file help2
$ sed -n '/\(^clk_file \| clk_file$\| clk_file \)/p' file
clk_file help
help clk_file
help1 clk_file help2
$ grep '\(^clk_file \| clk_file$\| clk_file \)' file
clk_file help
help clk_file
help1 clk_file help2
如果您的搜索值是变量,
$ myval="clk_file"
$ grep "\(^${myval} \| ${myval}$\| ${myval} \)"
clk_file help
help clk_file
help1 clk_file help2