在 Unix 中用于特殊字符的 grep

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

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

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

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

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

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

401098 次浏览

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

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

选项 -n是获取行号所必需的,

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

对我有用的是:

grep -e '->'

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

发信人: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/

一张相关的纸条

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

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  \r   b  \n

Regarding the use of $'\r' and other supported characters, see Bash 手册 > ANSI-C 引用:

特别处理 $‘ string’格式的单词。该单词扩展为字符串,由 ANSI C 标准指定的反斜杠转义字符替换

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

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

使用-b 选项尝试 vi,这将显示特殊的行尾字符 (I typically use it to see windows line endings in a txt file on a unix OS)

但是如果您想要一个脚本化的解决方案,显然 vi 不能工作,因此您可以尝试使用 grep 的-f 或-e 选项,并将结果导入 sed 或 awk。 来自 grep man page:

配对选择 - E-扩展的 regexp 将 PATTERN 解释为扩展的正则表达式(见下文)

   -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.)