我有一个日志文件(application.log),其中可能包含多行以下正常字符和特殊字符的字符串:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
我想搜索包含此特殊字符串的行号。
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
上面的命令不返回任何结果。
获取行号的正确语法是什么?
我有一个日志文件(application.log),其中可能包含多行以下正常字符和特殊字符的字符串:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
我想搜索包含此特殊字符串的行号。
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
上面的命令不返回任何结果。
获取行号的正确语法是什么?
Answers:
告诉grep
您使用-F
option 将您的输入视为固定字符串。
grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
-n
需要选项以获得行号,
grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
^
,$
,.
,*
和\
。或者您也可以尝试fgrep
。
fgrep
与相同grep -F
。
egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
怎么办?
对我有用的是:
grep -e '->'
-e表示下一个参数是模式,不会被解释为参数。
来自:http : //www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/
-
,又见stackoverflow.com/questions/2427913/...
要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标准的规定替换反斜杠转义字符
您可以尝试删除所有字母数字字符和空格。然后使用-n
将为您提供行号。请尝试以下操作:
grep -vn "^[a-zA-Z0-9 ]*$" application.log
尝试使用带有-b选项的vi,它将显示特殊的行尾字符(我通常使用它来查看unix操作系统上txt文件中的Windows行尾)
但是,如果您希望使用脚本解决方案显然无法正常工作,那么可以尝试使用带有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.)
^@
:^
后面是@
字符还是nul?