【问题标题】:grep for special characters in UnixUnix 中特殊字符的 grep
【发布时间】:2012-09-05 10:40:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • ^@ :表示^ 后跟@ 或空字符?

标签: unix search grep special-characters


【解决方案1】:

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

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

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

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

【讨论】:

  • 根据您的 grep 版本,您只需转义(使用反斜杠)^$.*\ 。或者你也可以试试fgrep
  • @NahuelFouilleul:+1。顺便说一句,fgrepgrep -F 相同。
  • @PrinceJohnWesley: 是一样的,但是在某些系统上 grep 有很多版本,所以使用 fgrep 可能会找到支持 -F 的版本
  • 如果他用egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log怎么办?
  • 不起作用。 grep -rinF '-static' 打印 Invalid option «t»。 @Mani 的answer worked,即grep -rin "\-static"
【解决方案2】:
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

【讨论】:

    【解决方案3】:

    对我有用的是:

    grep -e '->'
    

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

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

    【讨论】:

    • str='! " # $ % & ( ) * + , - . / : ; ? @ [ \ ] ^ _ ` { | } ~' ; echo "$str" | grep -e "$str" .....不工作,对你有用的除了开关符号'-'之外没有足够的特殊字符,但是赢 -F 而不是 -e 工作!
    • 唯一对我有用的东西,即使是 '\' 或 -F 或 fgrep 也不起作用。谢谢!
    • 这应该是公认的答案 - 简单且适用于 grep
    • 在搜索包含“-”字符的字符串时,尝试了 -F 和 fgrep 对我不起作用。这行得通。
    • 我想知道为什么这个答案出现在这个问题中(stackoverflow.com/q/12387685 参考我目前正在查看的问答) - 可能是从另一个问题合并答案的错误案例?要搜索以- 开头的模式,另请参阅stackoverflow.com/questions/2427913/…
    【解决方案4】:

    相关说明

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

    grep -F $'\r' application.log
    

    或者,使用 printfecho 以实现 POSIX 兼容性

    grep -F "$(printf '\r')" application.log
    

    我们可以使用hexdumpless查看结果:

    $ printf "a\rb" | grep -F $'\r' | hexdump -c
    0000000   a  \r   b  \n
    

    关于$'\r'和其他支持的字符的使用,见Bash Manual > ANSI-C Quoting

    $'string' 形式的单词被特殊处理。单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 谢谢.. 从文件中查找特殊字符对我很有用。
      【解决方案6】:

      试试 vi 加上 -b 选项,这会显示特殊的行尾字符 (我通常用它来查看 unix 操作系统上 txt 文件中的 windows 行结尾)

      但是如果你想要一个脚本化的解决方案,显然 vi 不会工作,所以你可以尝试使用 grep 的 -f 或 -e 选项并将结果通过管道传输到 sed 或 awk。 从 grep 手册页:

      匹配器选择 -E,--扩展正则表达式 将 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.)
      

      【讨论】:

      • 在什么方面这比公认的答案更好,所以您将它添加到近 5 年的老问题中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多