2010-02-15 181 views
0

我有一大堆文件与他们的SQL命令,我被要求从文件中提取所有数据库表名称 我如何使用grep和sed来解析文件并创建一个列表文本文件中的唯一表名称..每行一个?grep和sed命令

名称名称似乎都以“db_”开头,这很方便!

什么是最好的方式来使用grep和sed在一起拉出表名称?

+1

您可以发布的SQL文件是什么样子的例子吗? – 2010-02-15 23:12:37

+1

几乎任何你从sed/grep得到的答案都是为了确认你进入它的假设。即如果你首先搜索'db_',那就是你将要得到的东西,无论它的真实性如何 - 即使它们不是表名,任何以这种方式开始的字符串都将被显示,不符合该模式的字符串将不会显示,即使它们引用了表。不幸的是,一个正确的答案将需要一个(几乎)完整的SQL解析器... – 2010-02-15 23:28:46

回答

6

这将搜索包含表名称的行。如果需要更多的选择性搜索这个输出将很快显露:

grep "\<db_[a-zA-Z0-9_]*" *.sql 

一旦适当的搜索整理出来,从线,表名删除所有其他字符:

grep "\<db_[a-zA-Z0-9_]*" *.sql | sed 's/.*\(\<db_[a-zA-Z0-9_]*\).*/\1/' 

一旦这运行,加上一个排序和删除重复项:

(same last pipe expression) | sort | uniq 
+1

+1。要在同一行中捕获可能的多个表名,可以用tr分隔行:'grep .. * .sql | tr'''\ n'| grep .. | sed'。首先grep是为了减轻'tr'的负担,第二个grep是过滤掉非“db_”部分。 – orip 2010-02-16 00:56:50

0

只需用grep

grep -owE "db_[a-zA-Z0-9]+" file|sort -u 

或AWK

awk '{for(i=1;i<=NF;i++)if($i~/^db_[a-zA-Z0-9]+/){print $i} }' file