2010-02-15 225 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