查找源代码中未引用的存储过程

时间:2009-11-12 21:03:27

标签: grep

我试图通过删除应用程序未使用的所有过程来清理旧数据库。使用grep,我已经能够确定源代码中没有出现单个过程。有没有办法一次为所有程序执行此操作?

UPDATE:使用-E“proc1 | proc2”时,所有文件中的所有行的输出都匹配任一模式,这不是很有用。遗留数据库有2000多个程序。

我尝试使用-o选项,认为我可以将其输出用作原始模式的反向搜索模式。但是,我发现在使用多个模式的-o选项时没有输出。

还有其他想法吗?

更新:经过进一步的实验,我发现它是阻止输出的-i和-o选项的组合。不幸的是,我需要在这种情况下进行不区分大小写的搜索。

4 个答案:

答案 0 :(得分:4)

将存储过程列表提供给以“|”

分隔的egrep

或:

for stored_proc in $stored_procs
do
grep $stored_proc $source_file
done

答案 1 :(得分:4)

我过去也必须这样做。不要忘记可能从其他过程中调用的任何过程。 如果您使用的是SQL Server,可以使用:

SELECT名称,        文本 来自sysobjects A.        加入系统评论B.        ON A.id = B.id WHERE xtype ='P'    AND text LIKE'%< sproc名称>%'

答案 2 :(得分:2)

我在编辑中描述的情况下获得输出:

$ echo "aaaproc1bbb" | grep -Eo 'proc1|proc2'
proc1
$ echo $?
0
$ echo "aaabbb" | grep -Eo 'proc1|proc2'
$ echo $?
1

退出代码显示是否没有匹配。

您可能还会发现grep这些选项很有用(-L可能特定于GNU grep):

-c, --count
              Suppress  normal output; instead print a count of matching lines
              for each input file.  With the -v,  --invert-match  option  (see
              below), count non-matching lines.  (-c is specified by POSIX.)

-L, --files-without-match
              Suppress normal output; instead print the  name  of  each  input
              file from which no output would normally have been printed.  The
              scanning will stop on the first match.

-l, --files-with-matches
              Suppress normal output; instead print the  name  of  each  input
              file  from  which  output would normally have been printed.  The
              scanning will stop on the first  match.   (-l  is  specified  by
              POSIX.)

-q, --quiet, --silent
              Quiet;   do   not  write  anything  to  standard  output.   Exit
              immediately with zero status if any match is found, even  if  an
              error  was  detected.   Also see the -s or --no-messages option.
              (-q is specified by POSIX.)

很抱歉引用了您的man页面,但有时屏幕上的内容会有所帮助。

修改

对于不包含任何过程的文件名列表(不区分大小写):

grep -EiL 'proc1|proc2' *

对于包含任何过程的文件名列表(不区分大小写):

grep -Eil 'proc1|proc2' *

列出文件并显示匹配(不区分大小写):

grep -Eio 'proc1|proc2' *

答案 3 :(得分:1)

从您的过程名称列表开始。为了便于以后重复使用,请对它们进行排序并将它们设为小写,如下所示:

tr "[:upper:]" "[:lower:]" < list_of_procedures | sort > sorted_list_o_procs

...现在你有一个程序名称的排序列表。听起来你已经在使用gnu grep了,所以你得到了-o选项。

fgrep -o -i -f sorted_list_o_procs source1 source2 ... > list_of_used_procs 

注意fgrep的使用:这些都不是正则表达式,所以为什么要这样对待它们。希望你也会发现这会神奇地纠正你的输出问题;)。现在你有一个丑陋的使用程序列表。让我们按照上面的原始列表清理它们。

tr "[:upper:]" "[:lower:]" < list_of_used_procs | sort -u > short_list

现在您有一个使用过程的简短列表。让我们找到原始列表中不在短列表中的那些。

fgrep -v -f short_list sorted_list_o_procs 

......他们在那里。