我试图通过删除应用程序未使用的所有过程来清理旧数据库。使用grep,我已经能够确定源代码中没有出现单个过程。有没有办法一次为所有程序执行此操作?
UPDATE:使用-E“proc1 | proc2”时,所有文件中的所有行的输出都匹配任一模式,这不是很有用。遗留数据库有2000多个程序。
我尝试使用-o选项,认为我可以将其输出用作原始模式的反向搜索模式。但是,我发现在使用多个模式的-o选项时没有输出。
还有其他想法吗?
更新:经过进一步的实验,我发现它是阻止输出的-i和-o选项的组合。不幸的是,我需要在这种情况下进行不区分大小写的搜索。
答案 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
......他们在那里。