117

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

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

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

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

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

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

4

6 回答 6

189

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

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

-n获取行号需要选项,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
于 2012-09-12T12:04:23.360 回答
110

对我有用的是:

grep -e '->'

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

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

于 2013-04-18T13:12:42.163 回答
8

相关说明

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

grep -F $'\r' application.log

或者,使用printf, 或echo, 以获得 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 标准指定的反斜杠转义字符替换

于 2016-05-15T16:07:44.750 回答
3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
于 2012-09-13T12:14:36.170 回答
2

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

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

于 2017-02-10T20:52:42.953 回答
-4

使用 -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.)
于 2017-03-02T16:48:52.003 回答