【问题标题】:Grep inside function body by function name按函数名在函数体内grep
【发布时间】:2016-01-19 08:59:37
【问题描述】:

函数体中使用函数名有什么技巧吗?此外,我想使用正则表达式而不是完整的函数名。

例如:linux内核驱动中有很多函数名为“xxx_probe”。所以,我想在所有这些函数中搜索一些字符串。

【问题讨论】:

  • 我不知道有什么工具可以让您在函数内部进行搜索。
  • 我也是;)但我希望存在一些命令行魔术)
  • 我认为您不会找到任何类似 grep 的东西,但请查看 beyondgrep.com/more-tools 以获取一些可能有帮助的工具。

标签: linux grep


【解决方案1】:

您可以使用pcregrep 对您要查找的函数进行grep:

pcregrep -M "(?s)int foo_probe.*?(?=^\}$)" somefile.c

这将以“int foo_probe”开始搜索,然后在仅包含“}”的下一行结束。 (?s) 将文件视为单行,以便 . 匹配换行符。

从那里,很容易将它传递给第二个 grep:

pcregrep -M "(?s)int foo_probe.*?(?=^\}$)" somefile.c | grep something

我不知道内核源文件是什么样的,所以可能需要一些调整...

【讨论】:

    【解决方案2】:

    这对我有用。 只需给 function_name 一个与您正在搜索的函数名称相等的字符串值,并将 5 替换为该函数块中估计的行数。

    function_name="foo"
    grep -A 5 -m 1 -h "ERROR\]: $function_name" $papiFileName |
                  grep -B 5 "}
    

    【讨论】:

      【解决方案3】:

      这个解决方案不仅使用 grep,而且我认为它仍然有用。

      给定这个函数的文本文件:

      $ cat functions.txt
      function bashfunction {
          echo "bash function"
      }
      
      def python_function():
          print('python function')
      
      
      sub perl_fuction {
          print "perl function\n";
      }
      

      如果您使用 grep 打印,您将获得 perl 和 python 打印:

      $ grep print functions.txt
          print('python function')
          print "perl function\n";
      

      如果你只想打印 perl 函数:

      $ awk '/sub/,/^}$/' functions.txt | grep print
          print "perl function\n";
      

      如果你只想要 python 函数打印:

      $ awk '/def/,/^$/' functions.txt | grep print
          print('python function')
      

      或者对于特定 bash 函数中的回声:

      $ awk '/bashfunction/,/^}$/' functions.txt | grep echo
          echo "bash function"
      

      使用正则表达式:

      $ awk '/bash[[:alpha:]]{8}/,/^}$/' functions.txt | grep echo
          echo "bash function"
      

      如果您的 awk 是 gawk,您可以使用简写运算符来获得更好的正则表达式:

      $ gawk '/bash\S+\s{$/,/^}$/' functions.txt | grep echo
          echo "bash function"
      

      你也可以使用sed:

      $ sed -n '/def/,/^$/p' functions.txt | grep print
          print('python function')
      

      你明白了。

      【讨论】:

        【解决方案4】:

        -A num grep 选项可能会有所帮助。它将在匹配行之后打印num 的尾随上下文行。

        grep "xxx_probe(" -A after-context-num | grep "search-str"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-10
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          • 2015-09-27
          相关资源
          最近更新 更多