我正在尝试在文件中搜索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.任何帮助都将不胜感激。
答案 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表示单词边界