grep用于Unix中的特殊字符


92

我有一个日志文件(application.log),其中可能包含多行以下正常字符和特殊字符的字符串:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

我想搜索包含此特殊字符串的行号。

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

上面的命令不返回任何结果。

获取行号的正确语法是什么?


^@^后面是@字符还是nul?
Nahuel Fouilleul 2012年

Answers:


154

告诉grep您使用-Foption 将您的输入视为固定字符串。

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

-n需要选项以获得行号,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
根据您的grep的你只需要逃生(用反斜杠)的版本^$.*\ 。或者您也可以尝试fgrep
Nahuel Fouilleul 2012年

2
@NahuelFouilleul:+1。顺便说一句,fgrep与相同grep -F
约翰·卫斯理亲王

@PrinceJohnWesley:相同,但是在某些系统上有很多版本的grep,因此使用fgrep可能会找到支持-F的版本
Nahuel Fouilleul 2012年

如果他使用该egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log怎么办?
inckka 2014年

不起作用 grep -rinF '-static'版画Invalid option «t»。@Mani的答案有效,即grep -rin "\-static"
Hi-Angel

89

对我有用的是:

grep -e '->'

-e表示下一个参数是模式,不会被解释为参数。

来自:http : //www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str ='!“#$%&()* +,-。/:; <=>?@ [\] ^ _ _ {{}〜'; echo” $ str“ | grep -e” $ str“ .....不工作,对您
有用的东西

1
唯一适用于我的东西,即使'\'或-F或fgrep也无效。谢谢!
user180574

2
这应该是公认的答案-简单且适用于grep
Ishay Peled

1
在搜索包含'-'char的字符串时,尝试过-F和fgrep对我不起作用。这有效。
世界知名伟人

我想知道为什么这个问题中存在这个答案(stackoverflow.com/q/12387685作为我当前正在查看的问答的参考)-可能是另一个问题合并了答案的错误情况?要搜索开始模式-,又见stackoverflow.com/questions/2427913/...
森迪普•

6

相关说明

要grep进行回车,即 \r0x0d要用字符或,我们可以这样做:

grep -F $'\r' application.log

或者,使用 printfecho来实现POSIX兼容性

grep -F "$(printf '\r')" application.log

我们可以使用hexdumpless查看结果:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

关于使用 $'\r'和其他受支持字符,请参见Bash手册> ANSI-C引用

$'string'形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

您可以尝试删除所有字母数字字符和空格。然后使用-n将为您提供行号。请尝试以下操作:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


谢谢..从文件中查找特殊字符对我来说很有用。
Dipankar Nalui

-4

尝试使用带有-b选项的vi,它将显示特殊的行尾字符(我通常使用它来查看unix操作系统上txt文件中的Windows行尾)

但是,如果您希望使用脚本解决方案显然无法正常工作,那么可以尝试使用带有grep的-f或-e选项,并将结果传递到sed或awk中。从grep手册页:

匹配器选择-E,--extended-regexp将PATTERN解释为扩展的正则表达式(ERE,请参见下文)。(-E由POSIX指定。)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

2
以哪种方式比接受的答案更好,因此您将其添加到将近5年的旧问题中?
SergGr
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.