我有一个日志文件(application.log),它可能在多行中包含以下正常和特殊字符的字符串:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
我想搜索包含此特殊字符串的行号。
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
上面的命令不返回任何结果。
获取行号的正确语法是什么?
我有一个日志文件(application.log),它可能在多行中包含以下正常和特殊字符的字符串:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
我想搜索包含此特殊字符串的行号。
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
上面的命令不返回任何结果。
获取行号的正确语法是什么?
告诉grep
使用-F
选项将您的输入视为固定字符串。
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 \r b \n
关于使用$'\r'
和其他支持的字符,请参阅Bash 手册 > ANSI-C 引用:
$'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 OS 上 txt 文件中的 windows 行尾)
但是,如果您想要一个脚本化的解决方案,显然 vi 将不起作用,因此您可以尝试使用 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.)