在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
或者,使用printf
或echo
来实现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.)