我想搜索我的 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