正则表达式从 .sql 文件中提取数据库表名称

正则表达式从 .sql 文件中提取数据库表名称

我想搜索我的 SQL 查询目录并查找所有文件中最常见的数据库表。为此,我希望使用 来grep隔离这些名称,但我无法弄清楚仅提取表名的正则表达式。

我认为为了隔离表格,我正在寻找单词后面的文本字符串或者加入

我希望大家能够帮助我建立这个,但是目前我的 grep 语句只是查找这些词的出现,但是我如何直接拉出这些关键字后面的字符串呢?

grep -R "FROM" | grep -R  "JOIN"

答案1

我从 Google 中提取了一些示例查询,并创建了几个包含以下数据的 SQL 文件,以供示例使用:

文件1.sql

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2013
FROM CustomersOriginal
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID;

文件2.sql

-- Dumping data for table `user_details`
INSERT INTO `user_details` (`user_id`, `username`, `first_name`, `last_name`, `gender`, `password`, `status`) VALUES
(1, 'rogers63', 'david', 'john', 'Female', 'e6a33eee180b07e563d74fee8c2c66b8', 1);

您首先要寻找的是 grep 的 OR 运算符:

$ grep 'INTO\|FROM\|JOIN' *.sql
file1.sql:FROM Orders
file1.sql:INNER JOIN Customers
file1.sql:INTO CustomersOrderBackup2013
file1.sql:FROM CustomersOriginal
file1.sql:LEFT JOIN Orders
file2.sql:INSERT INTO `user_details` (`user_id`, `username`, `first_name`, `last_name`, `gender`, `password`, `status`) VALUES

这将从原始文件中获取整行。接下来让我们使用sed提取表名:

$ grep 'INTO\|FROM\|JOIN' *.sql | sed -r 's/.*?(FROM|INTO|JOIN)\s`?([^` ]*).*/\2/g'
Orders
Customers
CustomersOrderBackup2013
CustomersOriginal
Orders
user_details

最后,让我们消除重复的表:

$ grep 'INTO\|FROM\|JOIN' *.sql | sed -r 's/.*?(FROM|INTO|JOIN)\s`?([^` ]*).*/\2/g' | sort -u
Customers
CustomersOrderBackup2013
CustomersOriginal
Orders
user_details

相关内容