grep -w,带有修改过的字组成字符

时间:2014-06-16 09:21:45

标签: grep

我使用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

任何人都可以告诉我应该用什么来获得所需的输出。 提前致谢

2 个答案:

答案 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