如何在文件中fgrep / egrep精确字符串

时间:2013-05-23 09:37:11

标签: shell unix solaris grep

我正在尝试在文件中搜索EXACT字符串匹配项。我知道它可以通过“grep -w”完成,但由于某种原因,我不会用grep来做。

已经尝试过这些并且对我无效:

egrep '\< pattern \>' file
fgrep '\< pattern \>' file
egrep '^pattern$' file
fgrep '^pattern$' file

示例:

我想只显示包含“ABC100-10”字符串

的行
$ cat file
NULL1 VOID XX
NULL2 VOID XX
EMPTY VOID XX
ABC100-10 VOID XX
ABC100-102 VOID XX

当我尝试这个时:

egrep ABC100-10 file

实际输出:

ABC100-10 VOID XX
ABC100-102 VOID XX

预期输出

ABC100-10 VOID XX

带字边界:

egrep '\<ABC100-10\>' file

没有输出。预期产出:

ABC100-10 VOID XX

使用行边界的开始/结束:

egrep '^ABC100-10$' file

没有输出。预期产出:

ABC100-10 VOID XX

顺便说一下,我正在使用Solaris 8.任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

egrep使用正则表达式,即反斜杠,插入符号,美元符号和其他字符具有特殊含义。 fgrep使用文字字符串。要看到差异:

$ cd -- "$(mktemp --directory)" 
$ echo 'Bebop' > foo.txt
$ echo '$variable' > bar.txt
$ egrep '^Be' foo.txt || echo 'Not found'
Bebop
$ fgrep '^Be' foo.txt || echo 'Not found'
Not found
$ egrep '$var' bar.txt || echo 'Not found'
Not found
$ fgrep '$var' bar.txt || echo 'Not found'
$variable

如果不清楚,请提供file的实际命令和内容,结果以及您希望看到的内容。

更新:默认情况下,任何grep都会在该行的任何位置打印模式与匹配的每一行grep不会像谷歌那样进行单词搜索,只会查找字符串。因此,如果您要搜索 ABC100-10,则需要使用egrep '\<ABC100-10\>'(正如您尝试的那样)或egrep '\bABC100-10\b'。我认为您必须使用不支持grep\<的{​​{1}}版本,因为此处按预期工作。

\>^分别表示的开头和结尾,因此它们只打印包含 字符串的行他们。例如,要搜索空行,您可以使用$

答案 1 :(得分:1)

这可以吗?

grep "\bABC100-10\b" file

如果grep在Solaris上运行起来很奇怪,你可以使用perl

perl -ne 'print if /\bABC100-10\b/' file

\ b表示单词边界