查找字面字符串的Grep

138

我需要一个类似于grep的工具来搜索纯文本字符串。我正在寻找在另一个日志文件的一行中出现的日志文件行的情况。搜索文本可以包含各种正则表达式特殊字符,例如[]().*^$-\

是否有一种Unix搜索工具不使用正则表达式,而只是搜索字符串的字面发生?


为什么问题不是“我能让grep搜索字面字符串吗?”而是“有没有像grep这样可以搜索字面字符串的东西?”你知道,平头螺丝刀也可以适用于十字螺丝头 ;) - ADTC
6个回答

178
您可以使用grep命令,加上-F选项来实现此功能。
-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

1
“newline-separated fixed strings” 这个术语怎么在终端提示符上操作?我知道可以创建一个模式文件,但是不使用文件,在提示符上是否有可能进行操作?显然按下 Enter 键会执行命令。 - ADTC
19
我会回答自己的问题 :) 只需要使用 -e 选项重复提供多个固定字符串即可。像这样:grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4"。不需要换行符 ;) - ADTC
3
不可用于Solaris操作系统。相反,使用fgrep - majkinetor
4
我发现当搜索的字符串仅包含特殊字符时,我需要使用单引号,否则什么也找不到。因此以下命令没有返回任何结果: grep --include=\*.php -FRn -e "$$" 使用单引号可以得到想要的结果: grep --include=\*.php -FRn -e '$$' - Piemol
@Piemol 可能是因为 $bash 中有特殊含义,优先于 grep。单引号覆盖了那个特殊含义。但我不是100%确定。 - ADTC
4
你是对的,@ADTC。"$"和其他几个字符都是特殊字符,当你按下回车键并在执行grep(或其他命令)之前,它们将被bash替换。你可以告诉bash保留所有字符(除了单引号)不变,方法是将它们包含在单引号内。如果你需要输入一个单引号,可以这样做:'I'''m special'。 - ndemou

20

这要么是fgrep,要么是grep -F,两者都不会使用正则表达式。fgrepgrep -F完全相同,但我更喜欢不必担心参数,因为本质上懒惰 :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).

对于GNU grep来说,fgrep只是作为grep的符号链接提供,这使得它可以使用-F选项。 - Daenyth
4
egrepfgrep未被POSIX标准规定;grep -Fgrep -E - Richard Hansen

4
-F传递给grep

3
我误读成“按F键进行grep”而不是实际写的内容,这让我想起那些“按F键致敬”或“按X键怀疑”的迷因。我应该离开互联网了... - Wimateeka
1
你不是唯一的一个 @Wimateeka :) - Dave Bry

3

你也可以使用awk,它具有查找固定字符串的能力,以及编程能力,例如only。

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file

3

我非常喜欢GNU grep中可用的-P标志,可以选择性地忽略特殊字符。

它使得grep -P "^some_prefix\Q[literal]\E$"成为可能。

来自grep手册

-P, --perl-regexp 将-i解释为Perl兼容正则表达式(PCRE)。 当与-z(--null-data)选项结合使用时,此选项是实验性的,并且grep -P可能会警告未实现的功能。


2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

输出

one:hello:world
three:3:kudos

2
我不同意。这是一个有用的说明,展示了它是如何工作的。 - timwaagh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接