文字字符串的Grep


101

我正在寻找一种grep类型的工具来搜索纯文字字符串。我正在寻找一个日志文件行的出现,作为单独的日志文件中一行的一部分。搜索文本可以包含各种正则表达式特殊字符,例如[]().*^$-\

是否有一个Unix搜索实用程序不使用正则表达式,而仅搜索字符串的文字出现?


不知道为什么问题不是“我可以grep搜索文字字符串吗?” 而不是“是否有类似的东西grep可以搜索文字字符串?” 平头螺丝刀可以安装飞利浦螺丝头,您知道吗;)
ADTC '17

Answers:


136

您可以通过-F选项使用grep。

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

“以换行符分隔的固定字符串”如何在终端提示符下执行此操作?我知道我可以创建特征码文件,但是如果没有文件,是否可以在提示符下执行?按Enter键显然会执行命令。
ADTC

13
我会回答我自己的问题。:)您只需要使用-e选项的重复来提供多个固定字符串。像这样:grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4"。无需换行;)
ADTC

2
在Solaris上不可用。而是fgrep使用。
majkinetor

2
@ADTC我发现我必须对仅包含特殊字符的搜索字符串使用单引号,否则将找不到任何内容。因此,这没有返回任何结果:grep --include=\*.php -FRn -e "$$"使用单仲裁给了我想要的结果:grep --include=\*.php -FRn -e '$$'
Piemol

2
正确的@ADTC。$其他一些字符是特殊字符,在您按Enter键之后且grep执行(或执行任何命令)之前,它们将被bash替换。您可以通过将bash括在单引号中来告诉bash保留所有字符(单引号除外)。如果您需要输入单引号,请这样做'I'\''m special'
ndemou

14

这无论是fgrepgrep -F将不会做正则表达式。fgrep等同于grep -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 2010年

3
egrepfgrep没有由POSIX标准指定;grep -Fgrep -E
理查德·汉森


3

您也可以使用awk,因为它具有查找固定字符串的能力以及编程功能,例如

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.