在Unix中用于特殊字符的grep

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

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

我想search包含这个特殊string的行号。

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

上述命令不会返回任何结果。

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

告诉grep使用-F选项将input视为固定string。

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

选项-n需要获得行号,

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

那个为我工作的人是:

 grep -e '->' 

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

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

相关的说明

要grep回车,即\r字符,或0x0d ,我们可以这样做:

 grep -F $'\r' application.log 

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

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

而且我们可以使用hexdump ,或者less查看结果:

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

有关使用$'\r'和其他支持的字符,请参阅Bash手册> ANSI-C引用 :

$'string'forms的单词被专门处理。 字扩展为string,反斜杠转义字符被ANSI C标准指定

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

您可以尝试删除任何字母数字字符和空格。 然后使用-n会给你的行号。 尝试以下方法

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

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

但是如果你想要一个脚本化的解决scheme显然vi不会工作,所以你可以用grep试试-f或者-e选项,并把结果input到sed或者awk中。 从grep手册页:

匹配器select-E,–extended-regexp将PATTERN解释为扩展正则expression式(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.)